From c1a70a3c1e62543419433baf6b1f4c441ca2c63e Mon Sep 17 00:00:00 2001
From: Roger Sayle <roger@eyesopen.com>
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 acd83523c668..0349d92cb0ba 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 77626cb29bf4..cf2d999a3268 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 000000000000..09b96f9199f2
--- /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 b6b6d409d0b9..911ccb2e6322 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)))
-- 
GitLab