From 6b1184bab6d4f38dbab3a970634510bf9fc675b2 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 29 Aug 2013 07:45:59 +0000 Subject: [PATCH] re PR tree-optimization/57685 (GCC stuck in an infinite loop) 2013-08-29 Richard Biener 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 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr57685.c | 15 +++++++++++++++ gcc/tree-vrp.c | 12 ++++++++---- 4 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr57685.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c9658fd6813..2444b92cda7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-08-29 Richard Biener + + 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 * ipa-inline.c (edge_badness): Fix integer underflow. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index afd5eafde32..9b9ff4240ca 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-08-29 Richard Biener + + PR tree-optimization/57685 + * gcc.dg/torture/pr57685.c: New testcase. + 2013-08-28 Paolo Carlini 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 00000000000..75973f2a493 --- /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 48b9f7a072c..d5548ff55eb 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) -- 2.30.2