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 /gcc/tree-vrp.c | |
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
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 12 |
1 files changed, 8 insertions, 4 deletions
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) |