https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110204

--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
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;
     }
 }

Reply via email to