aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.c
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 /gcc/tree-vrp.c
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
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r--gcc/tree-vrp.c12
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)