From d54485660a538334a90ce036ae6b1e011b301515 Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Fri, 29 Apr 2005 16:23:18 +0000 Subject: [PATCH] re PR tree-optimization/21030 (ICE in set_value_range building 176.gcc with -O2) gcc/ PR tree-optimization/21030 * tree-vrp.c (adjust_range_with_scev): Do not create invalid ranges where VR->MAX is smaller than VR->MIN. testsuite/ PR tree-optimization/21030 * gcc.dg/tree-ssa/pr21030.c: New. From-SVN: r98999 --- gcc/ChangeLog | 6 ++++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.c-torture/compile/pr21030.c | 19 +++++++++++ gcc/tree-vrp.c | 33 +++++++++++++++---- 4 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr21030.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f06eb6cef30..16e35659119 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-04-28 Kazu Hirata + + PR tree-optimization/21030 + * tree-vrp.c (adjust_range_with_scev): Do not create invalid + ranges where VR->MAX is smaller than VR->MIN. + 2005-04-29 Devang Patel PR tree-optimization/21272 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 81708422136..7782528491c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-04-28 Kazu Hirata + + PR tree-optimization/21030 + * gcc.dg/tree-ssa/pr21030.c: New. + 2005-04-29 Devang Patel PR tree-optimization/21272 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr21030.c b/gcc/testsuite/gcc.c-torture/compile/pr21030.c new file mode 100644 index 00000000000..b7590c0edaa --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr21030.c @@ -0,0 +1,19 @@ +/* PR tree-optimization/21030 + VRP used to create invalid ranges where VR->MIN is greater than + VR->MAX. */ + +void +foo (int unit) +{ + int i; + + for (i = 0; unit; i++, unit--) + { + if (i >= 0) + { + int j = i; + while (j) + j--; + } + } +} diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 4d0b034f754..0fe5c7bcbbb 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -893,19 +893,40 @@ adjust_range_with_scev (value_range *vr, struct loop *l, tree var) } else if (vr->type == VR_RANGE) { + tree min = vr->min; + tree max = vr->max; + if (init_is_max) { - /* INIT is the maximum value. If INIT is lower than - VR->MAX, set VR->MAX to INIT. */ - if (compare_values (init, vr->max) == -1) - set_value_range (vr, VR_RANGE, vr->min, init); + /* INIT is the maximum value. If INIT is lower than VR->MAX + but no smaller than VR->MIN, set VR->MAX to INIT. */ + if (compare_values (init, max) == -1) + { + max = init; + + /* If we just created an invalid range with the minimum + greater than the maximum, take the minimum all the + way to -INF. */ + if (compare_values (min, max) == 1) + min = TYPE_MIN_VALUE (TREE_TYPE (min)); + } } else { /* If INIT is bigger than VR->MIN, set VR->MIN to INIT. */ - if (compare_values (init, vr->min) == 1) - set_value_range (vr, VR_RANGE, init, vr->max); + if (compare_values (init, min) == 1) + { + min = init; + + /* If we just created an invalid range with the minimum + greater than the maximum, take the maximum all the + way to +INF. */ + if (compare_values (min, max) == 1) + max = TYPE_MAX_VALUE (TREE_TYPE (max)); + } } + + set_value_range (vr, VR_RANGE, min, max); } } -- 2.30.2