diff options
Diffstat (limited to 'llvm/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/llvm/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp b/llvm/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp index 11115524c81..4d278d4b05a 100644 --- a/llvm/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp +++ b/llvm/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp @@ -57,15 +57,16 @@ static bool extractConstantMask(const Constant *C, unsigned MaskEltSizeInBits, if (!COp || (!isa<UndefValue>(COp) && !isa<ConstantInt>(COp))) return false; + unsigned BitOffset = i * CstEltSizeInBits; + if (isa<UndefValue>(COp)) { - APInt EltUndef = APInt::getLowBitsSet(CstSizeInBits, CstEltSizeInBits); - UndefBits |= EltUndef.shl(i * CstEltSizeInBits); + unsigned HiBits = BitOffset + CstEltSizeInBits; + UndefBits |= APInt::getBitsSet(CstSizeInBits, BitOffset, HiBits); continue; } - APInt EltBits = cast<ConstantInt>(COp)->getValue(); - EltBits = EltBits.zextOrTrunc(CstSizeInBits); - MaskBits |= EltBits.shl(i * CstEltSizeInBits); + auto *Elt = cast<ConstantInt>(COp); + MaskBits |= Elt->getValue().zextOrTrunc(CstSizeInBits).shl(BitOffset); } // Now extract the undef/constant bit data into the raw shuffle masks. |