From: Roger Sayle Date: Tue, 21 Feb 2006 02:28:03 +0000 (+0000) Subject: re PR tree-optimization/26361 (bootstrap failure on Alpha: xgcc runs out of memory... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c1a70a3c1e62543419433baf6b1f4c441ca2c63e;p=gcc.git re PR tree-optimization/26361 (bootstrap failure on Alpha: xgcc runs out of memory compiling libiberty/md5.c) PR tree-optimization/26361 * tree-vrp.c (extract_range_from_unary_expr): Handle NEGATE_EXPR of unsigned integer types. * gcc.dg/tree-ssa/vrp27.c: New test case. From-SVN: r111327 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index acd83523c66..0349d92cb0b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-02-20 Roger Sayle + + PR tree-optimization/26361 + * tree-vrp.c (extract_range_from_unary_expr): Handle NEGATE_EXPR + of unsigned integer types. + 2006-02-20 Sebastian Pop * tree-chrec.c (eq_evolutions_p): New. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 77626cb29bf..cf2d999a326 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-02-20 Roger Sayle + + PR tree-optimization/26361 + * gcc.dg/tree-ssa/vrp27.c: New test case. + 2006-02-20 Andrew Pinski * 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 00000000000..09b96f9199f --- /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 b6b6d409d0b..911ccb2e632 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)))