diff --git a/gcc/ChangeLog b/gcc/ChangeLog index acd83523c66891425072f9bf30015c3cac5744ae..0349d92cb0ba52ce44a10fad1d9446ee71ed10e1 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 77626cb29bf4ffde5f71ef6e9988786440eee3b9..cf2d999a3268b7786a6839e062689c3f384e8d8f 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 0000000000000000000000000000000000000000..09b96f9199f2912185e358b5b41cf3096643d145 --- /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 b6b6d409d0b92e9c2d650adfa8f1576e07eb15e3..911ccb2e632272832e8d5fe022ff05366f936328 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)))