https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120280
--- Comment #12 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Andrew Pinski from comment #10) > (In reply to Andrew Pinski from comment #9) > > 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. > > This also works around the issue: > ``` > diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc > index b74fb8bb50c..b7e5d32c76d 100644 > --- a/gcc/gimple-fold.cc > +++ b/gcc/gimple-fold.cc > @@ -11108,6 +11108,8 @@ gimple_phi_nonnegative_warnv_p (gimple *stmt, bool > *strict_overflow_p, > for (unsigned i = 0; i < gimple_phi_num_args (stmt); ++i) > { > tree arg = gimple_phi_arg_def (stmt, i); > + if (!arg || SSA_NAME_IN_FREE_LIST (arg)) > + continue; > if (!tree_single_nonnegative_warnv_p (arg, strict_overflow_p, depth + > 1)) > return false; > } > > ``` > > But I am not 100% sure if this is correct. No. > Is FRE/VN supposed to leave around references to ssa names ih a phi which > are in the free list even if the block is no longer reachable and depend on > cleanup cfg? Yes. FRE/VN will have turned the conditions into if (0) / if (1) and relies on CFG cleanup to prune the unreachable parts of the CFG. FRE/VN does not bother to update/substitute into unreachable parts of the CFG as that's a waste of time.