https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110204
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Richard Biener from comment #5) > Yeah, the issue is that PRE figures out a new value here but we've already > done value-numbering so we can't alter the "old" solution here. So what we > do > is add a '0' with value '_42' (instead of value '0'). This "second order" > value numbering leaves more opportunities on the plate. It was IMHO > cleaner to insert a > > pretmp_163 = 0; > > than substituting '0' everywhere but then leaving around the third order > optimizations in case we had _42 + 1 that would then simplify to sth = 1 ... > > Previously we'd have inserted a degenerate PHI, now we get these kind of > copies. "Now" is for a long time so this isn't new for PRE at least. > > We could "hack" this by doing > > diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc > index 11061a374a2..effb4f4de73 100644 > --- a/gcc/tree-ssa-sccvn.cc > +++ b/gcc/tree-ssa-sccvn.cc > @@ -6615,6 +6615,13 @@ eliminate_dom_walker::eliminate_push_avail > (basic_block, tree op) > if (avail[SSA_NAME_VERSION (valnum)]) > pushop = avail[SSA_NAME_VERSION (valnum)]; > avail_stack.safe_push (pushop); > + if (gassign *ass = dyn_cast <gassign *> (SSA_NAME_DEF_STMT (op))) > + if (gimple_assign_rhs_class (ass) == GIMPLE_SINGLE_RHS) > + { > + tree rhs1 = gimple_assign_rhs1 (ass); > + if (CONSTANT_CLASS_P (rhs1) || TREE_CODE (rhs1) == SSA_NAME) > + op = rhs1; > + } > avail[SSA_NAME_VERSION (valnum)] = op; > } > } Ah, that breaks the avail stack handling. We can do the trick in eliminate_avail though where it's more expensive or make the avail stack more complicated.