tree-vrp.c (extract_range_from_assert): Set the range to VARYING for LT and GT if...
authorEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 25 May 2006 07:42:28 +0000 (07:42 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Thu, 25 May 2006 07:42:28 +0000 (07:42 +0000)
* tree-vrp.c (extract_range_from_assert): Set the range to VARYING
for LT and GT if the computed range is effectively empty.

From-SVN: r114108

gcc/ChangeLog
gcc/tree-vrp.c

index d94f8d6837c5cd78aebe840a78e825b54aaff378..64117ca1d5c2daf925c348d4bffc5e74c6de9034 100644 (file)
@@ -1,4 +1,9 @@
-2006-06-24  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
+2006-05-25  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * tree-vrp.c (extract_range_from_assert): Set the range to VARYING
+       for LT and GT if the computed range is effectively empty.
+
+2006-05-24  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
        PR target/27627
        * pa/pa-modes.def: Use mips_single_format, mips_double_format and
index 11c8077b8251aad8dd3b9459a739ad6e4d704993..3ac01fb70f36f55eb2057c3a964bba444e17321c 100644 (file)
@@ -939,14 +939,22 @@ extract_range_from_assert (value_range_t *vr_p, tree expr)
          max = limit_vr->max;
        }
 
-      /* For LT_EXPR, we create the range [MIN, MAX - 1].  */
-      if (cond_code == LT_EXPR)
+      /* If the maximum value forces us to be out of bounds, simply punt.
+        It would be pointless to try and do anything more since this
+        all should be optimized away above us.  */
+      if (cond_code == LT_EXPR && compare_values (max, min) == 0)
+       set_value_range_to_varying (vr_p);
+      else
        {
-         tree one = build_int_cst (type, 1);
-         max = fold_build2 (MINUS_EXPR, type, max, one);
-       }
+         /* For LT_EXPR, we create the range [MIN, MAX - 1].  */
+         if (cond_code == LT_EXPR)
+           {
+             tree one = build_int_cst (type, 1);
+             max = fold_build2 (MINUS_EXPR, type, max, one);
+           }
 
-      set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
+         set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
+       }
     }
   else if (cond_code == GE_EXPR || cond_code == GT_EXPR)
     {
@@ -962,14 +970,22 @@ extract_range_from_assert (value_range_t *vr_p, tree expr)
          min = limit_vr->min;
        }
 
-      /* For GT_EXPR, we create the range [MIN + 1, MAX].  */
-      if (cond_code == GT_EXPR)
+      /* If the minimum value forces us to be out of bounds, simply punt.
+        It would be pointless to try and do anything more since this
+        all should be optimized away above us.  */
+      if (cond_code == GT_EXPR && compare_values (min, max) == 0)
+       set_value_range_to_varying (vr_p);
+      else
        {
-         tree one = build_int_cst (type, 1);
-         min = fold_build2 (PLUS_EXPR, type, min, one);
-       }
+         /* For GT_EXPR, we create the range [MIN + 1, MAX].  */
+         if (cond_code == GT_EXPR)
+           {
+             tree one = build_int_cst (type, 1);
+             min = fold_build2 (PLUS_EXPR, type, min, one);
+           }
 
-      set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
+         set_value_range (vr_p, VR_RANGE, min, max, vr_p->equiv);
+       }
     }
   else
     gcc_unreachable ();