From 14dc13e5f5cae9de424a68c4a4f4533b1be614ce Mon Sep 17 00:00:00 2001
From: hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>
Date: Thu, 7 Dec 2006 12:54:09 +0000
Subject: [PATCH] 	* tree-vrp.c (compare_values): Short circuit
 INTEGER_CST; 	use fold_constant_to_binary; tolerate wrong type constants. 
 (value_intersect_p): Do just two tests.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@119619 138bc75d-0d04-0410-961f-82ee72b054a4
---
 gcc/ChangeLog  |  6 ++++++
 gcc/tree-vrp.c | 27 +++++++++++++++++++--------
 2 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ad6b37ed9282..aac2bb13e290 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2006-12-07  Jan Hubicka  <jh@suse.cz>
+
+	* tree-vrp.c (compare_values): Short circuit INTEGER_CST;
+	use fold_constant_to_binary; tolerate wrong type constants.
+	(value_intersect_p): Do just two tests.
+
 2006-12-07  Bernd Schmidt  <bernd.schmidt@analog.com>
 
 	* config/bfin/bfin.c (print_operand): New modifier 'N' for constants.
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 908f22bbaed4..eb28ca9cb5c5 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -620,10 +620,17 @@ compare_values (tree val1, tree val2)
       if (operand_less_p (val2, val1) == 1)
 	return 1;
 
-      /* If VAL1 is different than VAL2, return +2.  */
-      t = fold_binary (NE_EXPR, boolean_type_node, val1, val2);
-      if (t == boolean_true_node)
-	return 2;
+      /* If VAL1 is different than VAL2, return +2.
+	 For integer constants we either have already returned -1 or 1
+	 or they are equivalent.  We still might suceed prove something
+	 about non-trivial operands.  */
+      if (TREE_CODE (val1) != INTEGER_CST
+	  || TREE_CODE (val2) != INTEGER_CST)
+	{
+          t = fold_binary_to_constant (NE_EXPR, boolean_type_node, val1, val2);
+	  if (t && tree_expr_nonzero_p (t))
+	    return 2;
+	}
 
       return -2;
     }
@@ -682,10 +689,14 @@ value_inside_range (tree val, value_range_t * vr)
 static inline bool
 value_ranges_intersect_p (value_range_t *vr0, value_range_t *vr1)
 {
-  return (value_inside_range (vr1->min, vr0) == 1
-	  || value_inside_range (vr1->max, vr0) == 1
-	  || value_inside_range (vr0->min, vr1) == 1
-	  || value_inside_range (vr0->max, vr1) == 1);
+  /* The value ranges do not intersect if the maximum of the first range is
+     less than the minimum of the second range or vice versa.
+     When those relations are unknown, we can't do any better.  */
+  if (operand_less_p (vr0->max, vr1->min) != 0)
+    return false;
+  if (operand_less_p (vr1->max, vr0->min) != 0)
+    return false;
+  return true;
 }
 
 
-- 
GitLab