diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1105727eb5a7ccdb26e38348a84d72638359d216..2a13af21bdf01b636a25abae70169a441cee4b6b 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 334e96e46385cabef4161288a45174506393ce0f..2e5eee9ccf40a7dd1c9e57248abb140d05f035c3 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 0000000000000000000000000000000000000000..4d65349093454a0869aca85f39687a5df8fa140b
--- /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 bcbc7384d2e05161d74c1f3ceaec5857c0da3434..a42a21a882e8783f31cb5b0612cc0a88153a3c7d 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;