[WebAssembly] Fix legalization of shift operators on large integer types.

llvm-svn: 255847
This commit is contained in:
Dan Gohman 2015-12-16 23:25:51 +00:00
parent 38dcc9e355
commit 4172953813
2 changed files with 16 additions and 0 deletions

View File

@ -207,6 +207,13 @@ MVT WebAssemblyTargetLowering::getScalarShiftAmountTy(const DataLayout & /*DL*/,
unsigned BitWidth = NextPowerOf2(VT.getSizeInBits() - 1);
if (BitWidth > 1 && BitWidth < 8)
BitWidth = 8;
if (BitWidth > 64) {
BitWidth = 64;
assert(BitWidth >= Log2_32_Ceil(VT.getSizeInBits()) &&
"64-bit shift counts ought to be enough for anyone");
}
MVT Result = MVT::getIntegerVT(BitWidth);
assert(Result != MVT::INVALID_SIMPLE_VALUE_TYPE &&
"Unable to represent scalar shift amount type");

View File

@ -51,3 +51,12 @@ define float @fpconv_f64_f32(double *%p) {
%e = fptrunc double %v to float
ret float %e
}
; Check that big shifts work. This generates a big pile of code from the
; legalizer; the main thing here is that we don't abort.
; CHECK-LABEL: bigshift:
define i1024 @bigshift(i1024 %a, i1024 %b) {
%c = shl i1024 %a, %b
ret i1024 %c
}