I noticed we fail to valueize the RHS when looking for same-valued
stores.

Bootstrap / regtest running on x86_64-unknown-linux-gnu.

Richard.

2019-07-05  Richard Biener  <rguent...@suse.de>

        * tree-ssa-sccvn.c (vn_reference_lookup_3): Valueize RHS
        when comparing against a store with possibly the same value.

        * gcc.dg/tree-ssa/ssa-fre-77.c: New testcase.

Index: gcc/tree-ssa-sccvn.c
===================================================================
--- gcc/tree-ssa-sccvn.c        (revision 273083)
+++ gcc/tree-ssa-sccvn.c        (working copy)
@@ -2012,9 +2268,11 @@ vn_reference_lookup_3 (ao_ref *ref, tree
          if (res && res != (void *)-1)
            {
              vn_reference_t vnresult = (vn_reference_t) res;
+             tree rhs = gimple_assign_rhs1 (def_stmt);
+             if (TREE_CODE (rhs) == SSA_NAME)
+               rhs = SSA_VAL (rhs);
              if (vnresult->result
-                 && operand_equal_p (vnresult->result,
-                                     gimple_assign_rhs1 (def_stmt), 0))
+                 && operand_equal_p (vnresult->result, rhs, 0))
                return res;
            }
        }
Index: gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-77.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-77.c  (nonexistent)
+++ gcc/testsuite/gcc.dg/tree-ssa/ssa-fre-77.c  (working copy)
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-fre1" } */
+
+int foo (int *p, int *q)
+{
+  int x;
+  *p = 1;
+  x = *p;
+  *q = x;
+  return *p;
+}
+
+/* { dg-final { scan-tree-dump "return 1;" "fre1" } } */

Reply via email to