summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>2005-04-29 16:23:18 +0000
committerkazu <kazu@138bc75d-0d04-0410-961f-82ee72b054a4>2005-04-29 16:23:18 +0000
commitf486df52cfa8a0e6ae6f8c0e1d32b1a2420d5f88 (patch)
tree7d79e5bb9ea9131043f8689608e39ddf697f7968 /gcc
parent3d9471be16a43b824571e1fcd447caed2d26280f (diff)
downloadgcc-f486df52cfa8a0e6ae6f8c0e1d32b1a2420d5f88.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@98999 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr21030.c19
-rw-r--r--gcc/tree-vrp.c33
4 files changed, 57 insertions, 6 deletions
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 <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 81708422136..7782528491c 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 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);
}
}