On Fri, Mar 13, 2009 at 7:07 PM, Joseph S. Myers
<jos...@codesourcery.com> wrote:
> On Fri, 13 Mar 2009, Richard Guenther wrote:
>
>> Hm.  In fold-const.c we try to make sure to produce the same result
>> as the target would for constant-folding shifts.  Thus, Paolo, I think
>> what fold-const.c does is what we should assume for
>> !SHIFT_COUNT_TRUNCATED.  No?
>
> I think attempting the same result as the target for this undefined
> behavior is a pretty futile endeavour; I think we also optimize in places
> on the basis of it being undefined.  We don't attempt to generate the same
> results at compile time and runtime for out of range floating-point to
> integer conversions (unspecified value according to C99 Annex F, so we
> don't need to generate the same results), which has actually attracted bug
> reports; there, some languages may place more precise requirements on what
> the results are (e.g. bug 28144).

Last time I sent a patch to remove the SHIFT_COUNT_TRUNCATED check
from fold-const.c the reason that this was rejected was that we want to
be consistend with target behavior...

> This does not of course rule out adding options in future (and associated
> tree codes) that make this defined (probably making negative shifts act
> like shifts in the opposite direction, and out-of-range shifts act like
> shifting one bit at a time, rather than using target-specific semantics)
> or causing the undefined cases to generate traps.
>
> As I understand it, SHIFT_COUNT_TRUNCATED is about the semantics of RTL,
> and has no bearing on the implemented semantics of any source language or
> of GENERIC or GIMPLE; GENERIC and GIMPLE both follow the rule that
> out-of-range shifts (or rotates?), including those by negative amounts,
> are undefined.

"Undefined" is a bad semantic for GIMPLE.  If the frontends want the middle-end
to take advantage of undefinedness it needs to translate it to a useful defined
state.

Richard.

Reply via email to