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 | 3 +-
gcc/c/c-typeck.cc | 6 +--
gcc/fold-const.cc | 108 ++++++-------------------------------
gcc/fold-const.h | 3 +-
gcc/tree-ssa-loop-manip.cc | 4 +-
5 files changed, 22 insertions(+), 102 deletions(-)
diff --git a/gcc/c-family/c-warn.cc b/gcc/c-family/c-warn.cc
index e956fae51ca..07d15c0b09c 100644
--- a/gcc/c-family/c-warn.cc
+++ b/gcc/c-family/c-warn.cc
@@ -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
diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc
index 04b33111f62..5c6d0db5acc 100644
--- a/gcc/c/c-typeck.cc
+++ b/gcc/c/c-typeck.cc
@@ -6686,8 +6686,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. */
@@ -6723,9 +6721,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,
diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc
index 3f08f2dee77..d2f38ecf51b 100644
--- a/gcc/fold-const.cc
+++ b/gcc/fold-const.cc
@@ -10899,7 +10899,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)
@@ -11912,10 +11911,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)
@@ -11924,11 +11922,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,
@@ -12511,38 +12504,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 !=. */
@@ -14574,11 +14551,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. */
@@ -14603,11 +14580,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:
@@ -14669,11 +14641,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:
@@ -14792,11 +14759,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:
@@ -14833,11 +14795,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:
@@ -15025,11 +14982,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:
@@ -15090,15 +15042,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))
@@ -15159,24 +15109,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.
@@ -15217,7 +15149,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:
@@ -15226,10 +15157,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)
@@ -15250,7 +15179,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))
{
@@ -15259,13 +15187,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;
diff --git a/gcc/fold-const.h b/gcc/fold-const.h
index 30d044ae5fb..cefb5acf26d 100644
--- a/gcc/fold-const.h
+++ b/gcc/fold-const.h
@@ -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);
diff --git a/gcc/tree-ssa-loop-manip.cc b/gcc/tree-ssa-loop-manip.cc
index 03e255281b7..df6cd8629bc 100644
--- a/gcc/tree-ssa-loop-manip.cc
+++ b/gcc/tree-ssa-loop-manip.cc
@@ -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);
--
2.43.0