[PATCH PR c/71699] Handle pointer arithmetic in nonzero tree checks

Manish Goregaokar manish@mozilla.com
Thu Jun 30 11:22:00 GMT 2016


gcc/ChangeLog:
    PR c/71699
    * fold-const.c (tree_binary_nonzero_warnv_p): Allow
    pointer addition to also be considered nonzero.
---
 gcc/fold-const.c | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 3b9500d..eda713e 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -13200,16 +13200,22 @@ tree_binary_nonzero_warnv_p (enum tree_code code,
     {
     case POINTER_PLUS_EXPR:
     case PLUS_EXPR:
-      if (ANY_INTEGRAL_TYPE_P (type) && TYPE_OVERFLOW_UNDEFINED (type))
+      if ((ANY_INTEGRAL_TYPE_P (type) && TYPE_OVERFLOW_UNDEFINED (type))
+          || POINTER_TYPE_P (type))
     {
+      /* Pointers are always nonnegative, check integers.  */
+      if (ANY_INTEGRAL_TYPE_P (type))
+      {
+          sub_strict_overflow_p = false;
+          if (!tree_expr_nonnegative_warnv_p (op0,
+                              &sub_strict_overflow_p)
+              || !tree_expr_nonnegative_warnv_p (op1,
+                             &sub_strict_overflow_p))
+            return false;
+      }
       /* With the presence of negative values it is hard
          to say something.  */
-      sub_strict_overflow_p = false;
-      if (!tree_expr_nonnegative_warnv_p (op0,
-                          &sub_strict_overflow_p)
-          || !tree_expr_nonnegative_warnv_p (op1,
-                         &sub_strict_overflow_p))
-        return false;
+
       /* One of operands must be positive and the other non-negative.  */
       /* We don't set *STRICT_OVERFLOW_P here: even if this value
          overflows, on a twos-complement machine the sum of two
-- 
2.8.3



More information about the Gcc-patches mailing list