From c7ce5a980bb54e84e69f17096c1e68d7857f2cd2 Mon Sep 17 00:00:00 2001
From: steven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 14 Jul 2005 22:54:42 +0000
Subject: 	PR tree-optimization/22230

gcc/
	* tree-vrp.c (extract_range_from_binary_expr): Fix logics thinko in
	the computation of the four cross productions for "range op range".

testsuite/
	* gcc.dg/tree-ssa/pr22230.c: New test.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@102038 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog                           |  6 ++++++
 gcc/testsuite/ChangeLog                 |  5 +++++
 gcc/testsuite/gcc.dg/tree-ssa/pr22230.c | 21 +++++++++++++++++++++
 gcc/tree-vrp.c                          |  2 +-
 4 files changed, 33 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr22230.c

(limited to 'gcc')

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1105727eb5a..2a13af21bdf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-07-14  Steven Bosscher  <stevenb@suse.de>
+
+	PR tree-optimization/22230
+	* tree-vrp.c (extract_range_from_binary_expr): Fix logics thinko in
+	the computation of the four cross productions for "range op range".
+
 2005-07-14  Alexandre Oliva  <aoliva@redhat.com>
             Ulrich Weigand  <uweigand@de.ibm.com>
 
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 334e96e4638..2e5eee9ccf4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-07-15  Steven Bosscher  <stevenb@suse.de>
+
+	PR tree-optimization/22230
+	* gcc.dg/tree-ssa/pr22230.c: New test.
+
 2005-07-14  Jakub Jelinek  <jakub@redhat.com>
 
 	* gfortran.dg/g77/cpp6.f: New test.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr22230.c b/gcc/testsuite/gcc.dg/tree-ssa/pr22230.c
new file mode 100644
index 00000000000..4d653490934
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr22230.c
@@ -0,0 +1,21 @@
+/* { dg-do run } */
+/* { dg-options "-O1 -ftree-vrp" } */
+
+/* PR tree-optimization/22230
+
+   The meet of the ranges in "i*i" was not computed correctly, leading
+   gcc to believe that a was equal to 0 after the loop.  */
+
+extern void abort (void) __attribute__((noreturn));
+
+int main (void)
+{
+  long a, i;
+
+  for (i = 0; i < 5; i++)
+    a = i * i;
+  if (a != 16)
+    abort ();
+  return 0;
+}
+
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index bcbc7384d2e..a42a21a882e 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -1183,7 +1183,7 @@ extract_range_from_binary_expr (value_range_t *vr, tree expr)
 	       ? vrp_int_const_binop (code, vr0.max, vr1.min)
 	       : NULL_TREE;
 
-      val[3] = (vr0.min != vr1.min && vr0.max != vr1.max)
+      val[3] = (vr0.min != vr0.max && vr1.min != vr1.max)
 	       ? vrp_int_const_binop (code, vr0.max, vr1.max)
 	       : NULL_TREE;
 
-- 
cgit v1.2.1