re PR tree-optimization/68240 (compilation hangs on valid code at -O1 and above on...
authorRichard Biener <rguenther@suse.de>
Tue, 10 Nov 2015 10:14:02 +0000 (10:14 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 10 Nov 2015 10:14:02 +0000 (10:14 +0000)
2015-11-10  Richard Biener  <rguenther@suse.de>

PR tree-optimization/68240
* tree-ssa-sccvn.c (cond_stmts_equal_p): Handle commutative compares
properly.
(visit_phi): For PHIs with just a single executable edge
take its value directly.
(expressions_equal_p): Handle VN_TOP properly.

* gcc.dg/torture/pr68240.c: New testcase.

From-SVN: r230095

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

index 9db12db3a75edeca989cfd6edba3cffa19dca5cd..3bc856546c657fbde5c9ec2170f6ed9db4e855c9 100644 (file)
@@ -1,3 +1,12 @@
+2015-11-10  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/68240
+       * tree-ssa-sccvn.c (cond_stmts_equal_p): Handle commutative compares
+       properly.
+       (visit_phi): For PHIs with just a single executable edge
+       take its value directly.
+       (expressions_equal_p): Handle VN_TOP properly.
+
 2015-11-10  Richard Biener  <rguenther@suse.de>
 
        * tree-vect-data-refs.c (vect_slp_analyze_node_dependences):
index bbaf9a347c8e9566bad3b0cc8b836a4b30b90dd8..f2a7d3f6f96514c8bc4195a01318ac5be26df83d 100644 (file)
@@ -1,3 +1,8 @@
+2015-11-10  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/68240
+       * gcc.dg/torture/pr68240.c: New testcase.
+
 2015-11-10  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/56118
diff --git a/gcc/testsuite/gcc.dg/torture/pr68240.c b/gcc/testsuite/gcc.dg/torture/pr68240.c
new file mode 100644 (file)
index 0000000..b6d9790
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+
+int a, b, f;
+
+void
+fn1 ()
+{
+  int c = 1, d, e = 1;
+  a = 1; 
+  for (; f;)
+    b = (c && (d = (e && a)));
+}
index 9585f905438b5ff07dae1e4782fd93b3d052347d..2ac382842d3610a6686413c050e26331690eabca 100644 (file)
@@ -2760,11 +2760,15 @@ cond_stmts_equal_p (gcond *cond1, gcond *cond2, bool *inverted_p)
   else
     return false;
 
-  if (! expressions_equal_p (vn_valueize (lhs1), vn_valueize (lhs2))
-      || ! expressions_equal_p (vn_valueize (rhs1), vn_valueize (rhs2)))
-    return false;
-
-  return true;
+  lhs1 = vn_valueize (lhs1);
+  rhs1 = vn_valueize (rhs1);
+  lhs2 = vn_valueize (lhs2);
+  rhs2 = vn_valueize (rhs2);
+  return ((expressions_equal_p (lhs1, lhs2)
+          && expressions_equal_p (rhs1, rhs2))
+         || (commutative_tree_code (code1)
+             && expressions_equal_p (lhs1, rhs2)
+             && expressions_equal_p (rhs1, lhs2)));
 }
 
 /* Compare two phi entries for equality, ignoring VN_TOP arguments.  */
@@ -3379,6 +3383,7 @@ visit_phi (gimple *phi)
   tree result;
   tree sameval = VN_TOP;
   bool allsame = true;
+  unsigned n_executable = 0;
 
   /* TODO: We could check for this in init_sccvn, and replace this
      with a gcc_assert.  */
@@ -3394,6 +3399,7 @@ visit_phi (gimple *phi)
       {
        tree def = PHI_ARG_DEF_FROM_EDGE (phi, e);
 
+       ++n_executable;
        if (TREE_CODE (def) == SSA_NAME)
          def = SSA_VAL (def);
        if (def == VN_TOP)
@@ -3408,9 +3414,11 @@ visit_phi (gimple *phi)
       }
   
   /* If none of the edges was executable or all incoming values are
-     undefined keep the value-number at VN_TOP.  */
-  if (sameval == VN_TOP)
-    return set_ssa_val_to (PHI_RESULT (phi), VN_TOP);
+     undefined keep the value-number at VN_TOP.  If only a single edge
+     is exectuable use its value.  */
+  if (sameval == VN_TOP
+      || n_executable == 1)
+    return set_ssa_val_to (PHI_RESULT (phi), sameval);
 
   /* First see if it is equivalent to a phi node in this block.  We prefer
      this as it allows IV elimination - see PRs 66502 and 67167.  */
@@ -4610,6 +4618,10 @@ expressions_equal_p (tree e1, tree e2)
   if (e1 == e2)
     return true;
 
+  /* If either one is VN_TOP consider them equal.  */
+  if (e1 == VN_TOP || e2 == VN_TOP)
+    return true;
+
   /* If only one of them is null, they cannot be equal.  */
   if (!e1 || !e2)
     return false;