https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120280
--- Comment #9 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Replaced redundant PHI node defining c_3 with c_6 Replaced redundant PHI node defining b_13 with 0 Removing unexecutable edge from if (b_13 != 0) Removing dead stmt b_13 = PHI <0(3)> Removing dead stmt c_3 = PHI <c_6(3)> (gdb) p debug_tree(t) <ssa_name 0x7ffff740d8b8 type <error_mark 0x7ffff7402f48> nothrow def_stmt version:3 in-free-list> c_19 = PHI <_3(4), c_1(7), c_15(6)> So FRE removes _3 definition and the bb(4) is not reachable any more. We are doing cleanup cfg and we call gimple_simplify on the cond: ``` # c_6 = PHI <0(2), c_19(8)> # .MEM_9 = PHI <.MEM_12(D)(2), .MEM_18(8)> if (c_6 < d_14(D)) goto <bb 5>; [INV] else goto <bb 4>; [INV] ``` Where we are trying to match first tree_expr_nonnegative_p. So the easy workaround is not use tree_expr_nonnegative_p as predicate here and just do: ``` (simplify (cmp @0 zerop@1) (if (tree_expr_nonnegative_p (@0) && !fixed_zerop (@1) ``` Though I am not 100% sure this will workaround all of the issues.