https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103690
--- Comment #5 from Aldy Hernandez <aldyh at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #2) > (gdb) p debug_gimple_stmt(stmt) > _67 = _14 + _66; > > > Before pre had: > intD.9 * __trans_tmp_1D.2946; > .... > # RANGE [1, 9223372036854775807] NONZERO 9223372036854775804 > _66 = (long unsigned intD.16) _17; > # PT = nonlocal escaped > # ALIGN = 4, MISALIGN = 0 > _67 = __trans_tmp_1_14 + _66; > > But after: > # RANGE [1, 9223372036854775807] NONZERO 9223372036854775804 > _66 = (long unsigned intD.16) _17; > # PT = nonlocal escaped > # ALIGN = 4, MISALIGN = 0 > _67 = _14 + _66; > > We already removed the definition of _14 too: > Removing dead stmt __trans_tmp_1_14 = _24 + 4; > > So it is the order of the removal which is causing issues. Why is PRE removing the DEF of _14 when there are still uses? <bb 5> [local count: 69834]: __count.1_62 = (long unsigned int) _11; __builtin_memmove (_14, _9, __count.1_62); _66 = (long unsigned int) _17; _67 = _14 + _66; ...