From c1a70a3c1e62543419433baf6b1f4c441ca2c63e Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Tue, 21 Feb 2006 02:28:03 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/tree-ssa/vrp27.c | 33 +++++++++++++++++++++++++++++++++ gcc/tree-vrp.c | 18 ++++++++++++++++++ 4 files changed, 62 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/vrp27.c 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 + + 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 77626cb..cf2d999 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 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))) -- 2.7.4