On 2015.08.13 at 12:56 +0200, Mikael Morin wrote:
> Le 12/08/2015 22:07, Richard Sandiford a écrit :
> > Jeff Law <l...@redhat.com> writes:
> >> On 08/12/2015 12:32 PM, Richard Biener wrote:
> >>> On August 12, 2015 8:07:13 PM GMT+02:00, Jeff Law <l...@redhat.com> wrote:
> >>>> On 08/12/2015 11:12 AM, Richard Biener wrote:
> >>>>
> >>>>>
> >>>>> Prec is almost never a constant and is heavily used from wide-int.
> >>>>>
> >>>>> We are not exploiting this undefined ness in C so I object to making
> >>>> this so much slower.
> >>>>>
> >>>>> Can we instead do what we do for abs_hwi and add a checking assert so
> >>>> we can move the tests to the callers that misbehave instead?
> >>>> Given that ISO C++ is moving away from making shifting 1 into the sign
> >>>> bit undefined behaviour, maybe we should make UBSan less strict in its
> >>>> warning.  That may eliminate the need for Mikael's patch.
> >>>
> >>> We can also use an logical left shift followed by an arithmetic right
> >>> shift. Or is the latter invoking undefined behaviour as well in some
> >>> cases we hit?
> >> Hmm, why aren't we using logicals for the left shift to begin with?
> >> That's the problem area.  I don't think the right shifts are an issue at
> >> all.
> >
> > Well, they're implementation-defined, at least in C.  The C11 wording
> > for E1 >> E2 is "If E1 has a signed type and a negative value, the
> > resulting value is implementation-defined".  Is C++ different?
> > (I don't have the standard handy.)
> >
> > So...
> >
> >> It's strange that when I was researching this, consistently I saw folks
> >> suggesting the LEFT-SHIFT followed by RIGHT-SHIFT, then it'd get shot
> >> down as UB, then folks went to either Mikael's approach or another that
> >> is very similar.  Nobody suggested twidding the types to get a
> >> left-logical-shift, then doing a right-arithmetic-shift.
> >
> > ...unless C++ is different, there's not a standard-level concept
> > of arithmetic shift.
> >
> Still, implementation-defined behavior is a progress over undefined 
> behaviour.
> Even if it's not set in stone, the good thing about 
> implementation-defined behaviour is that it's known to be non-random.
> So it can be checked, either with autoconf, or with a macro.
> Would it be acceptable to have both variants of the code and decide 
> among them with such a check?
> It feels a bit overkill for such a little function, but it is the only 
> way that I see to achieve both need for speed and for well-defined-ness.
> I guess it won't kill the bootstrap-ubsan errors though.

For such cases you can use the ATTRIBUTE_NO_SANITIZE_UNDEFINED macro,
that is defined in include/ansidecl.h.

-- 
Markus

Reply via email to