]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
fold-const.cc: overhaul tree_expr_nonnegative_(warn)_p
authorDaniel Barboza <daniel.barboza@oss.qualcomm.com>
Sat, 17 Jan 2026 19:01:53 +0000 (16:01 -0300)
committerDaniel Barboza <daniel.barboza@oss.qualcomm.com>
Sat, 23 May 2026 17:20:45 +0000 (14:20 -0300)
We want to eliminate another source of Wstrict-overflow warnings from
tree_expr_nonnegative_warnv_p, via fold_overflow_warn(). At this point
strict_overflow_p is marked as ATTRIBUTE_UNUSED and we can remove it.

By removing it, the function would lost the "warnv" and be renamed to
tree_expr_nonnegative_p. This matches an existing function, that has a
different API. In a closer inspection we verify that
tree_expr_nonnegative_p is a wrapper for tree_expr_nonnegative_warn_p,
that throws a warning and leaves depth = 0 by default. This same
behavior can be achieved by removing strict_overflow_p from
tree_expr_nonnegative_warnv_p, so we'll go ahead with its rename and the
removal of the pre-existing tree_expr_nonnegative_p.

The additional strict_overflow_p local variables we've been adding to
satisfy the RECURSE() macro are all eliminated.

gcc/c-family/ChangeLog:

* c-warn.cc (warn_for_sign_compare): Remove strict_overflow_p
argument from tree_expr_nonnegative_p call.

gcc/c/ChangeLog:

* c-typeck.cc (build_conditional_expr): Likewise.

gcc/ChangeLog:

* fold-const.cc (fold_binary_loc): Likewise.
(tree_expr_nonnegative_warnv_p): Renamed to
tree_expr_nonnegative_p. Argument strict_overflow_p removed.
(tree_expr_nonnegative_p): Removed.
(RECURSE): Removed strict_overflow_p argument.
(tree_unary_nonnegative_p): Local strict_overflow_p variable
added to support the RECURSE() macro was removed.
(tree_binary_nonnegative_p): Likewise.
(tree_single_nonnegative_p): Likewise.
(tree_call_nonnegative_p): Likewise.
(tree_invalid_nonnegative_p): Likewise.
(tree_binary_nonzero_p): Removed sub_strict_overflow_p variable
from tree_expr_nonnegative_p call.
* fold-const.h (tree_expr_nonnegative_p): Removed.
(tree_expr_nonnegative_warnv_p): Renamed to
tree_expr_nonnegative_p, removed strict_overflow_p argument.
* tree-ssa-loop-manip.cc (create_iv): Removed ovf variable from
tree_expr_nonnegative_p call.

gcc/c-family/c-warn.cc
gcc/c/c-typeck.cc
gcc/fold-const.cc
gcc/fold-const.h
gcc/tree-ssa-loop-manip.cc

index e956fae51caf957b9276a0f7774fb97b1e6be89b..07d15c0b09c71f6eef1a39c69f271e4822133ba5 100644 (file)
@@ -2377,7 +2377,6 @@ warn_for_sign_compare (location_t location,
   else
     {
       tree sop, uop, base_type;
-      bool ovf;
 
       if (op0_signed)
        sop = orig_op0, uop = orig_op1;
@@ -2396,7 +2395,7 @@ warn_for_sign_compare (location_t location,
         literal (or some static constant expression involving such
         literals or a conditional expression involving such literals)
         and it is non-negative.  */
-      if (tree_expr_nonnegative_warnv_p (sop, &ovf))
+      if (tree_expr_nonnegative_p (sop))
        /* OK */;
       /* Do not warn if the comparison is an equality operation, the
         unsigned quantity is an integral constant, and it would fit
index 0c702f1a7e6e06f87335a0e51c6f21a1e6d3caab..6bf404ac9857d54a1648122fa8c3ee40c758f08c 100644 (file)
@@ -6811,8 +6811,6 @@ build_conditional_expr (location_t colon_loc, tree ifexp, bool ifexp_bcp,
 
          if (unsigned_op1 ^ unsigned_op2)
            {
-             bool ovf;
-
              /* Do not warn if the result type is signed, since the
                 signed type will only be chosen if it can represent
                 all the values of the unsigned type.  */
@@ -6848,9 +6846,9 @@ build_conditional_expr (location_t colon_loc, tree ifexp, bool ifexp_bcp,
                  if (warn_sign_compare)
                    {
                      if ((unsigned_op2
-                          && tree_expr_nonnegative_warnv_p (op1, &ovf))
+                          && tree_expr_nonnegative_p (op1))
                          || (unsigned_op1
-                             && tree_expr_nonnegative_warnv_p (op2, &ovf)))
+                             && tree_expr_nonnegative_p (op2)))
                        /* OK */;
                      else if (unsigned_op2)
                        warning_at (op1_loc, OPT_Wsign_compare,
index 5ac75a648846d7ac2e1e3e5f3a921f59c95c19e4..36d1e02f0188de325f6b6bde4bdd3d61142e05e5 100644 (file)
@@ -10909,7 +10909,6 @@ fold_binary_loc (location_t loc, enum tree_code code, tree type,
   enum tree_code_class kind = TREE_CODE_CLASS (code);
   tree arg0, arg1, tem;
   tree t1 = NULL_TREE;
-  bool strict_overflow_p;
   unsigned int prec;
 
   gcc_assert (IS_EXPR_CODE_CLASS (kind)
@@ -11922,10 +11921,9 @@ fold_binary_loc (location_t loc, enum tree_code code, tree type,
     case FLOOR_DIV_EXPR:
       /* Simplify A / (B << N) where A and B are positive and B is
         a power of 2, to A >> (N + log2(B)).  */
-      strict_overflow_p = false;
       if (TREE_CODE (arg1) == LSHIFT_EXPR
          && (TYPE_UNSIGNED (type)
-             || tree_expr_nonnegative_warnv_p (op0, &strict_overflow_p)))
+             || tree_expr_nonnegative_p (op0)))
        {
          tree sval = TREE_OPERAND (arg1, 0);
          if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
@@ -11934,11 +11932,6 @@ fold_binary_loc (location_t loc, enum tree_code code, tree type,
              tree pow2 = build_int_cst (TREE_TYPE (sh_cnt),
                                         wi::exact_log2 (wi::to_wide (sval)));
 
-             if (strict_overflow_p)
-               fold_overflow_warning (("assuming signed overflow does not "
-                                       "occur when simplifying A / (B << N)"),
-                                      WARN_STRICT_OVERFLOW_MISC);
-
              sh_cnt = fold_build2_loc (loc, PLUS_EXPR, TREE_TYPE (sh_cnt),
                                        sh_cnt, pow2);
              return fold_build2_loc (loc, RSHIFT_EXPR, type,
@@ -12521,38 +12514,22 @@ fold_binary_loc (location_t loc, enum tree_code code, tree type,
                                    TREE_OPERAND (arg0, 0), arg1));
 
       /* Convert ABS_EXPR<x> >= 0 to true.  */
-      strict_overflow_p = false;
       if (code == GE_EXPR
          && (integer_zerop (arg1)
              || (! HONOR_NANS (arg0)
                  && real_zerop (arg1)))
-         && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
-       {
-         if (strict_overflow_p)
-           fold_overflow_warning (("assuming signed overflow does not occur "
-                                   "when simplifying comparison of "
-                                   "absolute value and zero"),
-                                  WARN_STRICT_OVERFLOW_CONDITIONAL);
-         return omit_one_operand_loc (loc, type,
-                                      constant_boolean_node (true, type),
-                                      arg0);
-       }
+         && tree_expr_nonnegative_p (arg0))
+       return omit_one_operand_loc (loc, type,
+                                    constant_boolean_node (true, type),
+                                    arg0);
 
       /* Convert ABS_EXPR<x> < 0 to false.  */
-      strict_overflow_p = false;
       if (code == LT_EXPR
          && (integer_zerop (arg1) || real_zerop (arg1))
-         && tree_expr_nonnegative_warnv_p (arg0, &strict_overflow_p))
-       {
-         if (strict_overflow_p)
-           fold_overflow_warning (("assuming signed overflow does not occur "
-                                   "when simplifying comparison of "
-                                   "absolute value and zero"),
-                                  WARN_STRICT_OVERFLOW_CONDITIONAL);
-         return omit_one_operand_loc (loc, type,
-                                      constant_boolean_node (false, type),
-                                      arg0);
-       }
+         && tree_expr_nonnegative_p (arg0))
+       return omit_one_operand_loc (loc, type,
+                                    constant_boolean_node (false, type),
+                                    arg0);
 
       /* If X is unsigned, convert X < (1 << Y) into X >> Y == 0
         and similarly for >= into !=.  */
@@ -14584,11 +14561,11 @@ tree_expr_maybe_real_minus_zero_p (const_tree x)
   return true;
 }
 
-#define tree_expr_nonnegative_warnv_p(X, Y) \
+#define tree_expr_nonnegative_p(X, Y) \
   _Pragma ("GCC error \"Use RECURSE for recursive calls\"") 0
 
 #define RECURSE(X) \
-  ((tree_expr_nonnegative_warnv_p) (X, strict_overflow_p, depth + 1))
+  ((tree_expr_nonnegative_p) (X, depth + 1))
 
 /* Return true if CODE or TYPE is known to be non-negative. */
 
@@ -14613,11 +14590,6 @@ tree_unary_nonnegative_p (enum tree_code code, tree type, tree op0, int depth)
   if (TYPE_UNSIGNED (type))
     return true;
 
-  /* The RECURSE () macro counts with a strict_overflow_p bool
-     pointer being declared beforehand.  */
-  bool val = false;
-  bool *strict_overflow_p = &val;
-
   switch (code)
     {
     case ABS_EXPR:
@@ -14679,11 +14651,6 @@ tree_binary_nonnegative_p (enum tree_code code, tree type, tree op0,
   if (TYPE_UNSIGNED (type))
     return true;
 
-  /* The RECURSE () macro counts with a strict_overflow_p bool
-     pointer being declared beforehand.  */
-  bool val = false;
-  bool *strict_overflow_p = &val;
-
   switch (code)
     {
     case POINTER_PLUS_EXPR:
@@ -14802,11 +14769,6 @@ tree_single_nonnegative_p (tree t, int depth)
   if (TYPE_UNSIGNED (TREE_TYPE (t)))
     return true;
 
-  /* The RECURSE () macro counts with a strict_overflow_p bool
-     pointer being declared beforehand.  */
-  bool val = false;
-  bool *strict_overflow_p = &val;
-
   switch (TREE_CODE (t))
     {
     case INTEGER_CST:
@@ -14843,11 +14805,6 @@ bool
 tree_call_nonnegative_p (tree type, combined_fn fn, tree arg0, tree arg1,
                         int depth)
 {
-  /* The RECURSE () macro counts with a strict_overflow_p bool
-     pointer being declared beforehand.  */
-  bool val = false;
-  bool *strict_overflow_p = &val;
-
   switch (fn)
     {
     CASE_CFN_ACOS:
@@ -15040,11 +14997,6 @@ tree_invalid_nonnegative_p (tree t, int depth)
   if (TYPE_UNSIGNED (TREE_TYPE (t)))
     return true;
 
-  /* The RECURSE () macro counts with a strict_overflow_p bool
-     pointer being declared beforehand.  */
-  bool val = false;
-  bool *strict_overflow_p = &val;
-
   switch (code)
     {
     case TARGET_EXPR:
@@ -15105,15 +15057,13 @@ tree_invalid_nonnegative_p (tree t, int depth)
 }
 
 #undef RECURSE
-#undef tree_expr_nonnegative_warnv_p
+#undef tree_expr_nonnegative_p
 
 /* Return true if T is known to be non-negative.
    DEPTH is the current nesting depth of the query.  */
 
 bool
-tree_expr_nonnegative_warnv_p (tree t,
-                              bool *strict_overflow_p ATTRIBUTE_UNUSED,
-                              int depth)
+tree_expr_nonnegative_p (tree t, int depth)
 {
   enum tree_code code;
   if (error_operand_p (t))
@@ -15174,24 +15124,6 @@ tree_expr_nonnegative_warnv_p (tree t,
     }
 }
 
-/* Return true if `t' is known to be non-negative.  Handle warnings
-   about undefined signed overflow.  */
-
-bool
-tree_expr_nonnegative_p (tree t)
-{
-  bool ret, strict_overflow_p;
-
-  strict_overflow_p = false;
-  ret = tree_expr_nonnegative_warnv_p (t, &strict_overflow_p);
-  if (strict_overflow_p)
-    fold_overflow_warning (("assuming signed overflow does not occur when "
-                           "determining that expression is always "
-                           "non-negative"),
-                          WARN_STRICT_OVERFLOW_MISC);
-  return ret;
-}
-
 
 /* Return true when (CODE OP0) is an address and is known to be nonzero.
    For floating point we further ensure that T is not denormal.
@@ -15232,7 +15164,6 @@ tree_unary_nonzero_p (enum tree_code code, tree type, tree op0)
 bool
 tree_binary_nonzero_p (enum tree_code code, tree type, tree op0, tree op1)
 {
-  bool sub_strict_overflow_p = false;
   switch (code)
     {
     case POINTER_PLUS_EXPR:
@@ -15241,10 +15172,8 @@ tree_binary_nonzero_p (enum tree_code code, tree type, tree op0, tree op1)
        {
          /* With the presence of negative values it is hard
             to say something.  */
-         if (!tree_expr_nonnegative_warnv_p (op0,
-                                             &sub_strict_overflow_p)
-             || !tree_expr_nonnegative_warnv_p (op1,
-                                                &sub_strict_overflow_p))
+         if (!tree_expr_nonnegative_p (op0)
+             || !tree_expr_nonnegative_p (op1))
            return false;
          /* One of operands must be positive and the other non-negative.  */
          return (tree_expr_nonzero_p (op0)
@@ -15265,7 +15194,6 @@ tree_binary_nonzero_p (enum tree_code code, tree type, tree op0, tree op1)
       break;
 
     case MAX_EXPR:
-      sub_strict_overflow_p = false;
       if (tree_expr_nonzero_p (op0))
        {
 
@@ -15274,13 +15202,11 @@ tree_binary_nonzero_p (enum tree_code code, tree type, tree op0, tree op1)
            return true;
 
          /* MAX where operand 0 is positive is positive.  */
-         return tree_expr_nonnegative_warnv_p (op0,
-                                               &sub_strict_overflow_p);
+         return tree_expr_nonnegative_p (op0);
        }
       /* MAX where operand 1 is positive is positive.  */
       else if (tree_expr_nonzero_p (op1)
-              && tree_expr_nonnegative_warnv_p (op1,
-                                                &sub_strict_overflow_p))
+              && tree_expr_nonnegative_p (op1))
        return true;
       break;
 
index 30d044ae5fb9e7cb0bebd8738e1ff2725ac27e47..cefb5acf26dd1d944918cf4ddf058157962e352e 100644 (file)
@@ -199,8 +199,7 @@ extern tree size_diffop_loc (location_t, tree, tree);
 extern tree non_lvalue_loc (location_t, tree);
 
 extern bool tree_expr_nonzero_p (tree);
-extern bool tree_expr_nonnegative_p (tree);
-extern bool tree_expr_nonnegative_warnv_p (tree, bool *, int = 0);
+extern bool tree_expr_nonnegative_p (tree, int = 0);
 extern bool tree_expr_finite_p (const_tree);
 extern bool tree_expr_infinite_p (const_tree);
 extern bool tree_expr_maybe_infinite_p (const_tree);
index 03e255281b75dd0db355f8c40322c6cc39227194..df6cd8629bcfc9eee5b1029bbd65e5ed49abefce 100644 (file)
@@ -133,9 +133,7 @@ create_iv (tree base, tree_code incr_op, tree step, tree var, class loop *loop,
        }
       else
        {
-         bool ovf;
-
-         if (!tree_expr_nonnegative_warnv_p (step, &ovf)
+         if (!tree_expr_nonnegative_p (step)
              && may_negate_without_overflow_p (step))
            {
              incr_op = (incr_op == PLUS_EXPR ? MINUS_EXPR : PLUS_EXPR);