After changing all its internal helpers we're ready to change
tree_expr_nonzero_warnv_p. By removing the strict_overflow_p flag from
it we'll make the existing tree_expr_nonzero_p unneeded. We'll delete it
and rename tree_expr_nonzero_warnv_p to tree_expr_nonzero_p without
changing the API and the behavior for existing callers.
And we'll end up removing a fold_overflow_warn() call, which was our
whole idea in the end.
gcc/ChangeLog:
* fold-const.cc (tree_expr_nonzero_warnv_p): Renamed to
tree_expr_nonzero_p and removed the strict_overflow_p flag.
(tree_expr_nonzero_p): Removed it since it's now redundant with
tree_expr_nonzero_warnv_p.
(tree_unary_nonzero_p): Removed the local sub_strict_overflow_p
flag from the tree_expr_nonzero_p call.
(tree_binary_nonzero_p): Likewise.
(tree_single_nonzero_p): Likewise.
---
gcc/fold-const.cc | 83 +++++++++++------------------------------------
1 file changed, 19 insertions(+), 64 deletions(-)
diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc
index 69ca334c043..a41a990d0c6 100644
--- a/gcc/fold-const.cc
+++ b/gcc/fold-const.cc
@@ -10792,15 +10792,10 @@ mask_with_tz (tree type, const wide_int &x, const
wide_int &y)
/* Return true when T is an address and is known to be nonzero.
For floating point we further ensure that T is not denormal.
- Similar logic is present in nonzero_address in rtlanal.h.
-
- For certain tree code classes, 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. */
+ Similar logic is present in nonzero_address in rtlanal.h. */
-static bool
-tree_expr_nonzero_warnv_p (tree t, bool *strict_overflow_p)
+bool
+tree_expr_nonzero_p (tree t)
{
tree type = TREE_TYPE (t);
enum tree_code code;
@@ -10851,12 +10846,10 @@ tree_expr_nonzero_warnv_p (tree t, bool
*strict_overflow_p)
case COMPOUND_EXPR:
case MODIFY_EXPR:
case BIND_EXPR:
- return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
- strict_overflow_p);
+ return tree_expr_nonzero_p (TREE_OPERAND (t, 1));
case SAVE_EXPR:
- return tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 0),
- strict_overflow_p);
+ return tree_expr_nonzero_p (TREE_OPERAND (t, 0));
case CALL_EXPR:
{
@@ -10879,24 +10872,6 @@ tree_expr_nonzero_warnv_p (tree t, bool
*strict_overflow_p)
return false;
}
-/* Return true when T is an address and is known to be nonzero.
- Handle warnings about undefined signed overflow. */
-
-bool
-tree_expr_nonzero_p (tree t)
-{
- bool ret, strict_overflow_p;
-
- strict_overflow_p = false;
- ret = tree_expr_nonzero_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-zero"),
- WARN_STRICT_OVERFLOW_MISC);
- return ret;
-}
-
/* Return true if T is known not to be equal to an integer W.
If STMT is specified, the check is if T on STMT is not equal
to W. */
@@ -15223,12 +15198,10 @@ tree_expr_nonnegative_p (tree t)
bool
tree_unary_nonzero_p (enum tree_code code, tree type, tree op0)
{
- bool sub_strict_overflow_p = false;
switch (code)
{
case ABS_EXPR:
- return tree_expr_nonzero_warnv_p (op0,
- &sub_strict_overflow_p);
+ return tree_expr_nonzero_p (op0);
case NOP_EXPR:
{
@@ -15236,14 +15209,12 @@ tree_unary_nonzero_p (enum tree_code code, tree type,
tree op0)
tree outer_type = type;
return (TYPE_PRECISION (outer_type) >= TYPE_PRECISION (inner_type)
- && tree_expr_nonzero_warnv_p (op0,
- &sub_strict_overflow_p));
+ && tree_expr_nonzero_p (op0));
}
break;
case NON_LVALUE_EXPR:
- return tree_expr_nonzero_warnv_p (op0,
- &sub_strict_overflow_p);
+ return tree_expr_nonzero_p (op0);
default:
break;
@@ -15274,23 +15245,16 @@ tree_binary_nonzero_p (enum tree_code code, tree
type, tree op0, tree 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
- nonnegative numbers can never be zero. */
- return (tree_expr_nonzero_warnv_p (op0,
- &sub_strict_overflow_p)
- || tree_expr_nonzero_warnv_p (op1,
- &sub_strict_overflow_p));
+ return (tree_expr_nonzero_p (op0)
+ || tree_expr_nonzero_p (op1));
}
break;
case MULT_EXPR:
if (TYPE_OVERFLOW_UNDEFINED (type))
{
- if (tree_expr_nonzero_warnv_p (op0,
- &sub_strict_overflow_p)
- && tree_expr_nonzero_warnv_p (op1,
- &sub_strict_overflow_p))
+ if (tree_expr_nonzero_p (op0)
+ && tree_expr_nonzero_p (op1))
return true;
}
break;
@@ -15300,13 +15264,11 @@ tree_binary_nonzero_p (enum tree_code code, tree
type, tree op0, tree op1)
case MAX_EXPR:
sub_strict_overflow_p = false;
- if (tree_expr_nonzero_warnv_p (op0,
- &sub_strict_overflow_p))
+ if (tree_expr_nonzero_p (op0))
{
/* When both operands are nonzero, then MAX must be too. */
- if (tree_expr_nonzero_warnv_p (op1,
- &sub_strict_overflow_p))
+ if (tree_expr_nonzero_p (op1))
return true;
/* MAX where operand 0 is positive is positive. */
@@ -15314,18 +15276,15 @@ tree_binary_nonzero_p (enum tree_code code, tree
type, tree op0, tree op1)
&sub_strict_overflow_p);
}
/* MAX where operand 1 is positive is positive. */
- else if (tree_expr_nonzero_warnv_p (op1,
- &sub_strict_overflow_p)
+ else if (tree_expr_nonzero_p (op1)
&& tree_expr_nonnegative_warnv_p (op1,
&sub_strict_overflow_p))
return true;
break;
case BIT_IOR_EXPR:
- return (tree_expr_nonzero_warnv_p (op1,
- &sub_strict_overflow_p)
- || tree_expr_nonzero_warnv_p (op0,
- &sub_strict_overflow_p));
+ return (tree_expr_nonzero_p (op1)
+ || tree_expr_nonzero_p (op0));
default:
break;
@@ -15341,7 +15300,6 @@ tree_binary_nonzero_p (enum tree_code code, tree type,
tree op0, tree op1)
bool
tree_single_nonzero_p (tree t)
{
- bool sub_strict_overflow_p;
switch (TREE_CODE (t))
{
case INTEGER_CST:
@@ -15375,11 +15333,8 @@ tree_single_nonzero_p (tree t)
}
case COND_EXPR:
- sub_strict_overflow_p = false;
- if (tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 1),
- &sub_strict_overflow_p)
- && tree_expr_nonzero_warnv_p (TREE_OPERAND (t, 2),
- &sub_strict_overflow_p))
+ if (tree_expr_nonzero_p (TREE_OPERAND (t, 1))
+ && tree_expr_nonzero_p (TREE_OPERAND (t, 2)))
return true;
break;
--
2.43.0