> So the only question is whether or not the CEIL_MOD_EXPR and
> ROUND_MOD_EXPR bits are right. I'm confident the change to
> FLOOR_MOD_EXPR is right.
OK.
> Do we have any reasonable way to test CEIL_MOD_EXPR & ROUND_MOD_EXPR?
Note that the patch makes the function punt on those 2 so it can do no harm.
The sign of CEIL_MOD_EXPR is predictable (opposite of that of the divisor) but
you cannot use that in the context; and finally the sign of ROUND_MOD_EXPR
isn't predictable.
I can add a few more comments:
Index: fold-const.c
===================================================================
--- fold-const.c (revision 229022)
+++ fold-const.c (working copy)
@@ -12982,11 +12982,18 @@ tree_binary_nonnegative_warnv_p (enum tr
return RECURSE (op0) && RECURSE (op1);
case TRUNC_MOD_EXPR:
- case CEIL_MOD_EXPR:
- case FLOOR_MOD_EXPR:
- case ROUND_MOD_EXPR:
+ /* The sign of the remainder is that of the dividend. */
return RECURSE (op0);
+ case FLOOR_MOD_EXPR:
+ /* The sign of the remainder is that of the divisor. */
+ return RECURSE (op1);
+
+ case CEIL_MOD_EXPR:
+ /* The sign of the remainder is the opposite of that of the divisor,
+ but this cannot be used in this context. */
+ case ROUND_MOD_EXPR:
+ /* The sign of the remainder is not predictable. */
default:
return tree_simple_nonnegative_warnv_p (code, type);
}
--
Eric Botcazou