diff options
author | Kazu Hirata <kazu@cs.umass.edu> | 2005-04-29 16:23:18 +0000 |
---|---|---|
committer | Kazu Hirata <kazu@gcc.gnu.org> | 2005-04-29 16:23:18 +0000 |
commit | d54485660a538334a90ce036ae6b1e011b301515 (patch) | |
tree | 7d79e5bb9ea9131043f8689608e39ddf697f7968 /gcc | |
parent | 7dcc58cdbc2de85dd27ac79e20550643c7c8953d (diff) | |
download | gcc-d54485660a538334a90ce036ae6b1e011b301515.zip gcc-d54485660a538334a90ce036ae6b1e011b301515.tar.gz gcc-d54485660a538334a90ce036ae6b1e011b301515.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr21030.c | 19 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 33 |
4 files changed, 57 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f06eb6c..16e3565 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-04-28 Kazu Hirata <kazu@cs.umass.edu> + + 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 <dpatel@apple.com> PR tree-optimization/21272 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8170842..7782528 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-04-28 Kazu Hirata <kazu@cs.umass.edu> + + PR tree-optimization/21030 + * gcc.dg/tree-ssa/pr21030.c: New. + 2005-04-29 Devang Patel <dpatel@apple.com> 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 0000000..b7590c0 --- /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 4d0b034..0fe5c7b 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); } } |