[llvm-commits] proposed patch: shift when shift amount >= bit width
Chris Lattner
clattner at apple.com
Wed Jun 13 12:07:29 PDT 2007
On Jun 13, 2007, at 12:06 PM, Lauro Ramos Venancio wrote:
>> I don't think this is appropriate Lauro. The program needs to be
>> fixed, it's not just a codegen or optimizer issue, everything in the
>> compiler assumes that these shifts are undefined. Programs cannot
>> reliably expect a compiler to do the right thing here, and your patch
>> isn't a fix.
>
> Nowadays LLVM doesn't assume, in all places, that these shifts are
> undefined.
> See the following code (APInt.cpp):
>
> // If all the bits were shifted out, the result is 0. This avoids
> issues
> // with shifting by the size of the integer type, which produces
> undefined
> // results. We define these "undefined results" to always be 0.
> if (shiftAmt == BitWidth)
> return APInt(BitWidth, 0);
>
> and this code:
>
> // If all the bits were shifted out, the result is, technically,
> undefined.
> // We return -1 if it was negative, 0 otherwise. We check this
> early to avoid
> // issues in the algorithm below.
> if (shiftAmt == BitWidth) {
> if (isNegative())
> return APInt(BitWidth, -1ULL);
> else
> return APInt(BitWidth, 0);
> }
>
> I think to implement the gcc behavior would make easier the migration
> from gcc to llvm.
APInt can't return undef, so it has to pick a deterministic value.
LLVM values are a different story.
-Chris
More information about the llvm-commits
mailing list