We want to remove a fold_overflow_warn() nested inside
tree_exp_nonnegative_warnv_p. This function uses a lot of helpers, and
some of them do recursive calls for the helper itself.
Let's deal with strict_overflow_p flags for each helper first, starting
with tree_binary_nonnegative_warnv_p, that is now renamed to
tree_binary_nonnegative_p since it doesn't handle warnings anymore.
The RECURSE() macro expects a strict_overflow_p variable to be valid in
its scope, so we can't just remove the flag from the function
parameters. We're adding a temporary block that declares a local
strict_overflow_p variable to make RECURSE() happy. These declarations
will all be removed when we deal with tree_expr_nonnegative_warnv_p.
gcc/ChangeLog:
* fold-const.cc (tree_binary_nonnegative_warnv_p): Renamed to
tree_binary_nonnegative_p.
(tree_binary_nonnegative_p): Removed strict_overflow_p flag. Add
a local variable with the same name for RECURSE() that we'll
remove later.
(tree_expr_nonnegative_warnv_p): Removed strict_overflow_p flag
from tree_binary_nonnegative_p call.
* fold-const.h (tree_binary_nonnegative_warnv_p): Renamed to
tree_binary_nonnegative_p.
(tree_binary_nonnegative_p): Removed strict_overflow_p flag.
* gimple-fold.cc (gimple_assign_nonnegative_warnv_p): Likewise.
gcc/testsuite/ChangeLog:
* gcc.dg/pr56355-1.c: Removed since it's a warning check test
and we do not emit warnings for the code being tested.
---
gcc/fold-const.cc | 43 +++++++++++++++-----------------
gcc/fold-const.h | 3 +--
gcc/gimple-fold.cc | 10 ++++----
gcc/testsuite/gcc.dg/pr56355-1.c | 8 ------
4 files changed, 26 insertions(+), 38 deletions(-)
delete mode 100644 gcc/testsuite/gcc.dg/pr56355-1.c
diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc
index c4222539fef..9fe1cd40650 100644
--- a/gcc/fold-const.cc
+++ b/gcc/fold-const.cc
@@ -14660,19 +14660,21 @@ tree_unary_nonnegative_warnv_p (enum tree_code code,
tree type, tree op0,
return false;
}
-/* Return true if (CODE OP0 OP1) is known to be non-negative. If the return
- value is based on the assumption that signed overflow is undefined,
- set *STRICT_OVERFLOW_P to true; otherwise, don't change
- *STRICT_OVERFLOW_P. DEPTH is the current nesting depth of the query. */
+/* Return true if (CODE OP0 OP1) is known to be non-negative.
+ DEPTH is the current nesting depth of the query. */
bool
-tree_binary_nonnegative_warnv_p (enum tree_code code, tree type, tree op0,
- tree op1, bool *strict_overflow_p,
- int depth)
+tree_binary_nonnegative_p (enum tree_code code, tree type, tree op0,
+ tree op1, 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 POINTER_PLUS_EXPR:
@@ -14705,12 +14707,7 @@ tree_binary_nonnegative_warnv_p (enum tree_code code,
tree type, tree op0,
or without overflow. */
if (operand_equal_p (op0, op1, 0)
|| (RECURSE (op0) && RECURSE (op1)))
- {
- if (ANY_INTEGRAL_TYPE_P (type)
- && TYPE_OVERFLOW_UNDEFINED (type))
- *strict_overflow_p = true;
- return true;
- }
+ return true;
}
/* zero_extend(x) * zero_extend(y) is non-negative if x and y are
@@ -15105,11 +15102,11 @@ tree_expr_nonnegative_warnv_p (tree t, bool
*strict_overflow_p, int depth)
{
case tcc_binary:
case tcc_comparison:
- return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
- TREE_TYPE (t),
- TREE_OPERAND (t, 0),
- TREE_OPERAND (t, 1),
- strict_overflow_p, depth);
+ return tree_binary_nonnegative_p (TREE_CODE (t),
+ TREE_TYPE (t),
+ TREE_OPERAND (t, 0),
+ TREE_OPERAND (t, 1),
+ depth);
case tcc_unary:
return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
@@ -15131,11 +15128,11 @@ tree_expr_nonnegative_warnv_p (tree t, bool
*strict_overflow_p, int depth)
case TRUTH_AND_EXPR:
case TRUTH_OR_EXPR:
case TRUTH_XOR_EXPR:
- return tree_binary_nonnegative_warnv_p (TREE_CODE (t),
- TREE_TYPE (t),
- TREE_OPERAND (t, 0),
- TREE_OPERAND (t, 1),
- strict_overflow_p, depth);
+ return tree_binary_nonnegative_p (TREE_CODE (t),
+ TREE_TYPE (t),
+ TREE_OPERAND (t, 0),
+ TREE_OPERAND (t, 1),
+ depth);
case TRUTH_NOT_EXPR:
return tree_unary_nonnegative_warnv_p (TREE_CODE (t),
TREE_TYPE (t),
diff --git a/gcc/fold-const.h b/gcc/fold-const.h
index d6de959c810..bdecb5a24d5 100644
--- a/gcc/fold-const.h
+++ b/gcc/fold-const.h
@@ -167,8 +167,7 @@ extern bool tree_binary_nonzero_p (enum tree_code, tree,
tree, tree op1);
extern bool tree_single_nonzero_p (tree);
extern bool tree_unary_nonnegative_warnv_p (enum tree_code, tree, tree,
bool *, int);
-extern bool tree_binary_nonnegative_warnv_p (enum tree_code, tree, tree, tree,
- bool *, int);
+extern bool tree_binary_nonnegative_p (enum tree_code, tree, tree, tree, int);
extern bool tree_single_nonnegative_warnv_p (tree, bool *, int);
extern bool tree_call_nonnegative_warnv_p (tree, combined_fn, tree, tree,
bool *, int);
diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
index b92bf450aba..1ad77322833 100644
--- a/gcc/gimple-fold.cc
+++ b/gcc/gimple-fold.cc
@@ -11407,11 +11407,11 @@ gimple_assign_nonnegative_warnv_p (gimple *stmt, bool
*strict_overflow_p,
gimple_assign_rhs1 (stmt),
strict_overflow_p, depth);
case GIMPLE_BINARY_RHS:
- return tree_binary_nonnegative_warnv_p (gimple_assign_rhs_code (stmt),
- type,
- gimple_assign_rhs1 (stmt),
- gimple_assign_rhs2 (stmt),
- strict_overflow_p, depth);
+ return tree_binary_nonnegative_p (gimple_assign_rhs_code (stmt),
+ type,
+ gimple_assign_rhs1 (stmt),
+ gimple_assign_rhs2 (stmt),
+ depth);
case GIMPLE_TERNARY_RHS:
return false;
case GIMPLE_SINGLE_RHS:
diff --git a/gcc/testsuite/gcc.dg/pr56355-1.c b/gcc/testsuite/gcc.dg/pr56355-1.c
deleted file mode 100644
index 08b9c2e7109..00000000000
--- a/gcc/testsuite/gcc.dg/pr56355-1.c
+++ /dev/null
@@ -1,8 +0,0 @@
-/* { dg-do compile } */
-/* { dg-options "-O2 -Wstrict-overflow=4" } */
-
-int
-f (int i)
-{
- return __builtin_abs (i * i); /* { dg-warning "assuming signed overflow" } */
-}
--
2.43.0