re PR tree-optimization/64995 (ICE in vn_reference_insert_pieces, at tree-ssa-sccvn...
authorRichard Biener <rguenther@suse.de>
Tue, 10 Feb 2015 13:37:54 +0000 (13:37 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 10 Feb 2015 13:37:54 +0000 (13:37 +0000)
2015-02-10  Richard Biener  <rguenther@suse.de>

PR tree-optimization/64995
* tree-ssa-sccvn.c (set_ssa_val_to): Assert that the
value we use is final.
(visit_reference_op_store): Always valueize op.
(visit_use): Properly valueize vuses.

* g++.dg/torture/pr64995.C: New testcase.

From-SVN: r220581

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr64995.C [new file with mode: 0644]
gcc/tree-ssa-sccvn.c

index 7f3816c3e705d89d6e88a09eef15bac494da643e..788571c0715105df95faed5c059a7353f716becc 100644 (file)
@@ -1,3 +1,11 @@
+2015-02-10  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/64995
+       * tree-ssa-sccvn.c (set_ssa_val_to): Assert that the
+       value we use is final.
+       (visit_reference_op_store): Always valueize op.
+       (visit_use): Properly valueize vuses.
+
 2015-02-10  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/64909
index 15d5e2d67cd8daec49044e40afa401905a397c07..d1d8692a723eacd101c8d3eacca5a423199bc559 100644 (file)
@@ -1,3 +1,8 @@
+2015-02-10  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/64995
+       * g++.dg/torture/pr64995.C: New testcase.
+
 2015-02-10  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/64909
diff --git a/gcc/testsuite/g++.dg/torture/pr64995.C b/gcc/testsuite/g++.dg/torture/pr64995.C
new file mode 100644 (file)
index 0000000..f5b97cf
--- /dev/null
@@ -0,0 +1,28 @@
+// { dg-do compile }
+
+extern "C" double acos(double);
+class A {
+public:
+    double mY, mZ;
+    A(double, double);
+    double m_fn1(A *);
+    int *m_fn2();
+};
+double a;
+A *b;
+A::A(double, double) : mY(), mZ() {}
+
+double A::m_fn1(A *) { return mY * mZ; }
+
+inline int *A::m_fn2() {
+    mZ = 0;
+    double c = m_fn1(this);
+    a = acos(c);
+    double d = m_fn1(b);
+    acos(d);
+}
+
+void passTime() {
+    A e(0, 1);
+    e.m_fn2();
+}
index 0f1299affb897fe92dfa083dd76537312e53ea5e..e417a1536efc0a087bc3bdd232c23d56693152ee 100644 (file)
@@ -1606,7 +1606,7 @@ vn_reference_lookup_or_insert_for_pieces (tree vuse,
                                                va_heap> operands,
                                          tree value)
 {
-  struct vn_reference_s vr1;
+  vn_reference_s vr1;
   vn_reference_t result;
   unsigned value_id;
   vr1.vuse = vuse;
@@ -2816,7 +2816,8 @@ set_ssa_val_to (tree from, tree to)
     }
 
   gcc_assert (to != NULL_TREE
-             && (TREE_CODE (to) == SSA_NAME
+             && ((TREE_CODE (to) == SSA_NAME
+                  && (to == from || SSA_VAL (to) == to))
                  || is_gimple_min_invariant (to)));
 
   if (from != to)
@@ -3122,6 +3123,9 @@ visit_reference_op_store (tree lhs, tree op, gimple stmt)
   tree vuse = gimple_vuse (stmt);
   tree vdef = gimple_vdef (stmt);
 
+  if (TREE_CODE (op) == SSA_NAME)
+    op = SSA_VAL (op);
+
   /* First we want to lookup using the *vuses* from the store and see
      if there the last store to this location with the same address
      had the same value.
@@ -3144,8 +3148,6 @@ visit_reference_op_store (tree lhs, tree op, gimple stmt)
     {
       if (TREE_CODE (result) == SSA_NAME)
        result = SSA_VAL (result);
-      if (TREE_CODE (op) == SSA_NAME)
-       op = SSA_VAL (op);
       resultsame = expressions_equal_p (result, op);
     }
 
@@ -3722,7 +3724,7 @@ visit_use (tree use)
                  changed = set_ssa_val_to (lhs, simplified);
                  if (gimple_vdef (stmt))
                    changed |= set_ssa_val_to (gimple_vdef (stmt),
-                                              gimple_vuse (stmt));
+                                              SSA_VAL (gimple_vuse (stmt)));
                  goto done;
                }
              else if (simplified
@@ -3731,7 +3733,7 @@ visit_use (tree use)
                  changed = visit_copy (lhs, simplified);
                  if (gimple_vdef (stmt))
                    changed |= set_ssa_val_to (gimple_vdef (stmt),
-                                              gimple_vuse (stmt));
+                                              SSA_VAL (gimple_vuse (stmt)));
                  goto done;
                }
              else