2011-08-12 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 12 Aug 2011 11:29:01 +0000 (11:29 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 12 Aug 2011 11:29:01 +0000 (11:29 +0000)
* tree-vrp.c (extract_range_from_unary_expr_1): Implement
-X as 0 - X.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@177693 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/tree-vrp.c

index b53080e..e708c8e 100644 (file)
@@ -1,4 +1,9 @@
-2011-08-02  Romain Geissler  <romain.geissler@gmail.com>
+2011-08-12  Richard Guenther  <rguenther@suse.de>
+
+       * tree-vrp.c (extract_range_from_unary_expr_1): Implement
+       -X as 0 - X.
+
+2011-08-12  Romain Geissler  <romain.geissler@gmail.com>
 
        * Makefile.in (PLUGIN_HEADERS): Add C_TREE_H.
 
index 6944b42..df7a9a2 100644 (file)
@@ -2946,67 +2946,14 @@ extract_range_from_unary_expr_1 (value_range_t *vr,
 
   /* Apply the operation to each end of the range and see what we end
      up with.  */
-  if (code == NEGATE_EXPR
-      && !TYPE_UNSIGNED (type))
-    {
-      /* NEGATE_EXPR flips the range around.  We need to treat
-        TYPE_MIN_VALUE specially.  */
-      if (is_positive_overflow_infinity (vr0.max))
-       min = negative_overflow_infinity (type);
-      else if (is_negative_overflow_infinity (vr0.max))
-       min = positive_overflow_infinity (type);
-      else if (!vrp_val_is_min (vr0.max))
-       min = fold_unary_to_constant (code, type, vr0.max);
-      else if (needs_overflow_infinity (type))
-       {
-         if (supports_overflow_infinity (type)
-             && !is_overflow_infinity (vr0.min)
-             && !vrp_val_is_min (vr0.min))
-           min = positive_overflow_infinity (type);
-         else
-           {
-             set_value_range_to_varying (vr);
-             return;
-           }
-       }
-      else
-       min = TYPE_MIN_VALUE (type);
-
-      if (is_positive_overflow_infinity (vr0.min))
-       max = negative_overflow_infinity (type);
-      else if (is_negative_overflow_infinity (vr0.min))
-       max = positive_overflow_infinity (type);
-      else if (!vrp_val_is_min (vr0.min))
-       max = fold_unary_to_constant (code, type, vr0.min);
-      else if (needs_overflow_infinity (type))
-       {
-         if (supports_overflow_infinity (type))
-           max = positive_overflow_infinity (type);
-         else
-           {
-             set_value_range_to_varying (vr);
-             return;
-           }
-       }
-      else
-       max = TYPE_MIN_VALUE (type);
-    }
-  else if (code == NEGATE_EXPR
-          && TYPE_UNSIGNED (type))
+  if (code == NEGATE_EXPR)
     {
-      if (!range_includes_zero_p (&vr0))
-       {
-         max = fold_unary_to_constant (code, type, vr0.min);
-         min = fold_unary_to_constant (code, type, vr0.max);
-       }
-      else
-       {
-         if (range_is_null (&vr0))
-           set_value_range_to_null (vr, type);
-         else
-           set_value_range_to_varying (vr);
-         return;
-       }
+      /* -X is simply 0 - X, so re-use existing code that also handles
+         anti-ranges fine.  */
+      value_range_t zero = { VR_UNDEFINED, NULL_TREE, NULL_TREE, NULL };
+      set_value_range_to_value (&zero, build_int_cst (type, 0), NULL);
+      extract_range_from_binary_expr_1 (vr, MINUS_EXPR, type, &zero, &vr0);
+      return;
     }
   else if (code == ABS_EXPR
            && !TYPE_UNSIGNED (type))