aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2013-08-29 07:45:59 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2013-08-29 07:45:59 +0000
commit6b1184bab6d4f38dbab3a970634510bf9fc675b2 (patch)
tree85c5a4d586c56556ab70286081d0e775cca3399e
parent2ec974d90fb0920d58ed5f987e738f7d069eb3f4 (diff)
downloadgcc-6b1184bab6d4f38dbab3a970634510bf9fc675b2.zip
gcc-6b1184bab6d4f38dbab3a970634510bf9fc675b2.tar.gz
gcc-6b1184bab6d4f38dbab3a970634510bf9fc675b2.tar.bz2
re PR tree-optimization/57685 (GCC stuck in an infinite loop)
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. * gcc.dg/torture/pr57685.c: New testcase. From-SVN: r202068
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr57685.c15
-rw-r--r--gcc/tree-vrp.c12
4 files changed, 34 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c9658fd..2444b92 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index afd5eaf..9b9ff42 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..75973f2
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr57685.c
@@ -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;
+}
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 48b9f7a..d5548ff 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -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)