This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR64995


The following fixes PR64955 where we forgot to valueize VOPs before
using them as value-number.

Bootstrapped on x86_64-unknown-linux-gnu, testing in progress.

Richard.

2015-10-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.

Index: gcc/tree-ssa-sccvn.c
===================================================================
--- gcc/tree-ssa-sccvn.c	(revision 220578)
+++ gcc/tree-ssa-sccvn.c	(working copy)
@@ -1606,7 +1606,7 @@ vn_reference_lookup_or_insert_for_pieces
 					        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
   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
     {
       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
Index: gcc/testsuite/g++.dg/torture/pr64995.C
===================================================================
--- gcc/testsuite/g++.dg/torture/pr64995.C	(revision 0)
+++ gcc/testsuite/g++.dg/torture/pr64995.C	(working copy)
@@ -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 Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]