> > But how would that happen here?  If we constant-fold something that would
> > have overflowed by wrapping, we are ELIMINATING a signed overflow, not
> > INTRODUCING one.  Or do I misunderstand what folding we're talking about
> > here?
> 
> http://gcc.gnu.org/PR27116 is what led to the patch.

I think the patch is wrong.  This is not a case where the source contains
"- INT_MIN".  If it did, I think it would be perfectly safe to always fold
it in a wrapping way.

As I understand the issue here, the problem is that we're generating a
negation of a constant present in the source as part of ANOTHER
transformation.  But I'd argue that such should not be generated if the
constant overflows REGARDLESS of the state of -fwrapv: it requires far too
much analysis of whether such a transformation is valid in such case to
bother doing it.

So I think it's correct for nearly all of the places that call negate_expr in
fold to protect that call with a call to negate_expr_p (I note a few seem
missing), but I'd argue that folding the expression "-CST" should
unconditionally do so and that negate_expr_p should return FALSE if an
overflow would occur independently of flag_wrapv and flag_trapv.

Reply via email to