From 417295381308b9af6e431d3ceb42b4770969bc96 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Wed, 16 Dec 2015 23:25:51 +0000 Subject: [PATCH] [WebAssembly] Fix legalization of shift operators on large integer types. llvm-svn: 255847 --- llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp | 7 +++++++ llvm/test/CodeGen/WebAssembly/legalize.ll | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp index 2364366f3f54..ed7cb1909d9f 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp @@ -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"); diff --git a/llvm/test/CodeGen/WebAssembly/legalize.ll b/llvm/test/CodeGen/WebAssembly/legalize.ll index 7cc1246a86e8..e780b2ee36ca 100644 --- a/llvm/test/CodeGen/WebAssembly/legalize.ll +++ b/llvm/test/CodeGen/WebAssembly/legalize.ll @@ -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 +}