diff options
author | Richard Biener <rguenther@suse.de> | 2013-08-29 07:45:59 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2013-08-29 07:45:59 +0000 |
commit | 6b1184bab6d4f38dbab3a970634510bf9fc675b2 (patch) | |
tree | 85c5a4d586c56556ab70286081d0e775cca3399e | |
parent | 2ec974d90fb0920d58ed5f987e738f7d069eb3f4 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr57685.c | 15 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 12 |
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) |