[llvm-commits] proposed patch: shift when shift amount >= bit width

Lauro Ramos Venancio lauro.venancio at gmail.com
Wed Jun 13 12:06:12 PDT 2007


> 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.

Lauro



More information about the llvm-commits mailing list