aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/vrp27.c33
-rw-r--r--gcc/tree-vrp.c18
4 files changed, 62 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index acd8352..0349d92 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2006-02-20 Roger Sayle <roger@eyesopen.com>
+
+ PR tree-optimization/26361
+ * tree-vrp.c (extract_range_from_unary_expr): Handle NEGATE_EXPR
+ of unsigned integer types.
+
2006-02-20 Sebastian Pop <pop@cri.ensmp.fr>
* tree-chrec.c (eq_evolutions_p): New.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 77626cb..cf2d999 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-02-20 Roger Sayle <roger@eyesopen.com>
+
+ PR tree-optimization/26361
+ * gcc.dg/tree-ssa/vrp27.c: New test case.
+
2006-02-20 Andrew Pinski <pinskia@physics.uc.edu>
* gcc.dg/tree-ssa/complex-3.c: Split out first part into ...
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp27.c b/gcc/testsuite/gcc.dg/tree-ssa/vrp27.c
new file mode 100644
index 0000000..09b96f9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp27.c
@@ -0,0 +1,33 @@
+/* PR middle-end/26361. */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+void abort(void);
+
+__attribute__((noinline))
+void gen_rtx_CONST_INT(long long x) {
+ if (-x > 10)
+ abort();
+}
+__attribute__((noinline))
+int alpha_expand_prologue(long frame_size)
+{
+ unsigned long long a;
+ int probed;
+ if (frame_size <= 1) return;
+ unsigned long long b = -2;
+ a = -2;
+ do {
+ int a1 = a;
+ probed = -a1;
+ gen_rtx_CONST_INT (a1);
+ a -= 2;
+ a1 = -a;
+ probed = a1;
+ } while (probed < frame_size);
+}
+
+int main(void) {
+ alpha_expand_prologue(10);
+ return 0;
+}
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index b6b6d40..911ccb2 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -1790,6 +1790,24 @@ extract_range_from_unary_expr (value_range_t *vr, tree expr)
max = (vr0.min == TYPE_MIN_VALUE (TREE_TYPE (expr)) && !flag_wrapv)
? TYPE_MAX_VALUE (TREE_TYPE (expr))
: fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
+
+ }
+ else if (code == NEGATE_EXPR
+ && TYPE_UNSIGNED (TREE_TYPE (expr)))
+ {
+ if (!range_includes_zero_p (&vr0))
+ {
+ max = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.min);
+ min = fold_unary_to_constant (code, TREE_TYPE (expr), vr0.max);
+ }
+ else
+ {
+ if (range_is_null (&vr0))
+ set_value_range_to_null (vr, TREE_TYPE (expr));
+ else
+ set_value_range_to_varying (vr);
+ return;
+ }
}
else if (code == ABS_EXPR
&& !TYPE_UNSIGNED (TREE_TYPE (expr)))