tree-vrp.c (avoid_overflow_infinity): New static function, broken out of set_value_ra...
authorIan Lance Taylor <iant@google.com>
Wed, 23 May 2007 05:53:21 +0000 (05:53 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 23 May 2007 05:53:21 +0000 (05:53 +0000)
* tree-vrp.c (avoid_overflow_infinity): New static function,
broken out of set_value_range_to_value.
(set_value_range_to_value): Call avoid_overflow_infinity.
(extract_range_from_assert): Likewise.

From-SVN: r124981

gcc/ChangeLog
gcc/tree-vrp.c

index c882b1e54bbf69a08e250de4e67bce6629dc439b..ab1dc587a2ad6b3af5d4d2ddd69273114aab189a 100644 (file)
@@ -1,3 +1,10 @@
+2007-05-22  Ian Lance Taylor  <iant@google.com>
+
+       * tree-vrp.c (avoid_overflow_infinity): New static function,
+       broken out of set_value_range_to_value.
+       (set_value_range_to_value): Call avoid_overflow_infinity.
+       (extract_range_from_assert): Likewise.
+
 2007-05-22  Andrew Pinski  <andrew_pinski@playstation.sony.com>
 
        PR middle-end/31095
index efb4f6890d81b568699ba0c77df9302812590fbb..dda5dd18cb06afaec84b619693e614c6cc431292 100644 (file)
@@ -201,6 +201,27 @@ is_overflow_infinity (tree val)
              || operand_equal_p (val, TYPE_MIN_VALUE (TREE_TYPE (val)), 0)));
 }
 
+/* If VAL is now an overflow infinity, return VAL.  Otherwise, return
+   the same value with TREE_OVERFLOW clear.  This can be used to avoid
+   confusing a regular value with an overflow value.  */
+
+static inline tree
+avoid_overflow_infinity (tree val)
+{
+  if (!is_overflow_infinity (val))
+    return val;
+
+  if (operand_equal_p (val, TYPE_MAX_VALUE (TREE_TYPE (val)), 0))
+    return TYPE_MAX_VALUE (TREE_TYPE (val));
+  else
+    {
+#ifdef ENABLE_CHECKING
+      gcc_assert (operand_equal_p (val, TYPE_MIN_VALUE (TREE_TYPE (val)), 0));
+#endif
+      return TYPE_MIN_VALUE (TREE_TYPE (val));
+    }
+}
+
 
 /* Return whether VAL is equal to the maximum value of its type.  This
    will be true for a positive overflow infinity.  We can't do a
@@ -361,19 +382,7 @@ static inline void
 set_value_range_to_value (value_range_t *vr, tree val, bitmap equiv)
 {
   gcc_assert (is_gimple_min_invariant (val));
-  if (is_overflow_infinity (val))
-    {
-      if (operand_equal_p (val, TYPE_MAX_VALUE (TREE_TYPE (val)), 0))
-       val = TYPE_MAX_VALUE (TREE_TYPE (val));
-      else
-       {
-#ifdef ENABLE_CHECKING
-         gcc_assert (operand_equal_p (val,
-                                      TYPE_MIN_VALUE (TREE_TYPE (val)), 0));
-#endif
-         val = TYPE_MIN_VALUE (TREE_TYPE (val));
-       }
-    }
+  val = avoid_overflow_infinity (val);
   set_value_range (vr, VR_RANGE, val, val, equiv);
 }
 
@@ -1103,6 +1112,8 @@ extract_range_from_assert (value_range_t *vr_p, tree expr)
       cond_code = swap_tree_comparison (TREE_CODE (cond));
     }
 
+  limit = avoid_overflow_infinity (limit);
+
   type = TREE_TYPE (limit);
   gcc_assert (limit != var);