diff options
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.h')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.h | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h index fa3fedf987c..426fb347af6 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.h +++ b/llvm/lib/Target/X86/X86ISelLowering.h @@ -18,6 +18,7 @@ #include "llvm/CodeGen/CallingConvLower.h" #include "llvm/CodeGen/SelectionDAG.h" #include "llvm/CodeGen/TargetLowering.h" +#include "llvm/Support/MathExtras.h" #include "llvm/Target/TargetOptions.h" namespace llvm { @@ -664,8 +665,14 @@ namespace llvm { void markLibCallAttributes(MachineFunction *MF, unsigned CC, ArgListTy &Args) const override; - MVT getScalarShiftAmountTy(const DataLayout &, EVT) const override { - return MVT::i8; + // For i512, DAGTypeLegalizer::SplitInteger needs a shift amount 256, + // which cannot be held by i8, therefore use i16 instead. In all the + // other situations i8 is sufficient. + MVT getScalarShiftAmountTy(const DataLayout &, EVT VT) const override { + MVT T = VT.getSizeInBits() >= 512 ? MVT::i16 : MVT::i8; + assert((VT.getSizeInBits() + 1) / 2 < (1U << T.getSizeInBits()) && + "Scalar shift amount type too small"); + return T; } const MCExpr * |