]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
2013-08-29 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 29 Aug 2013 07:45:59 +0000 (07:45 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 29 Aug 2013 07:45:59 +0000 (07:45 +0000)
PR tree-optimization/57685
* tree-vrp.c (register_edge_assert_for_1): Recurse only for
single-use operands to avoid exponential complexity.

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

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@202068 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr57685.c [new file with mode: 0644]
gcc/tree-vrp.c

index c9658fd681313872218e1c5ab5c306d4172ac960..2444b92cda73b807cebaaa7705d9e16ab7bf10e7 100644 (file)
@@ -1,3 +1,9 @@
+2013-08-29  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/57685
+       * tree-vrp.c (register_edge_assert_for_1): Recurse only for
+       single-use operands to avoid exponential complexity.
+
 2013-08-28  Dehao Chen  <dehao@google.com>
 
        * ipa-inline.c (edge_badness): Fix integer underflow.
index afd5eafde32c1663d3ee2f9d9d3b91c5da40742c..9b9ff4240caa65725456ea942ac5fb337637b0d5 100644 (file)
@@ -1,3 +1,8 @@
+2013-08-29  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/57685
+       * gcc.dg/torture/pr57685.c: New testcase.
+
 2013-08-28  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/58255
diff --git a/gcc/testsuite/gcc.dg/torture/pr57685.c b/gcc/testsuite/gcc.dg/torture/pr57685.c
new file mode 100644 (file)
index 0000000..75973f2
--- /dev/null
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+
+unsigned f(void)
+{
+  unsigned a;
+  int b, c, d, e;
+
+  for(c = 27; c < 40; c++)
+    b |= d |= b;
+
+  if(b)
+    a = e;
+
+  return a;
+}
index 48b9f7a072cc848b9ba5b365bc4ca444dce58166..d5548ff55eb3d8d554f02553fd2bcdf2dd7c7787 100644 (file)
@@ -5410,10 +5410,14 @@ register_edge_assert_for_1 (tree op, enum tree_code code,
               && gimple_assign_rhs_code (op_def) == BIT_IOR_EXPR))
     {
       /* Recurse on each operand.  */
-      retval |= register_edge_assert_for_1 (gimple_assign_rhs1 (op_def),
-                                           code, e, bsi);
-      retval |= register_edge_assert_for_1 (gimple_assign_rhs2 (op_def),
-                                           code, e, bsi);
+      tree op0 = gimple_assign_rhs1 (op_def);
+      tree op1 = gimple_assign_rhs2 (op_def);
+      if (TREE_CODE (op0) == SSA_NAME
+         && has_single_use (op0))
+       retval |= register_edge_assert_for_1 (op0, code, e, bsi);
+      if (TREE_CODE (op1) == SSA_NAME
+         && has_single_use (op1))
+       retval |= register_edge_assert_for_1 (op1, code, e, bsi);
     }
   else if (gimple_assign_rhs_code (op_def) == BIT_NOT_EXPR
           && TYPE_PRECISION (TREE_TYPE (gimple_assign_lhs (op_def))) == 1)