From: Craig Topper Date: Mon, 27 Feb 2017 16:15:25 +0000 (+0000) Subject: [X86] Use APInt instead of SmallBitVector for tracking undef elements in constant... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4b7fe0758a0b143d11fdc326c719627f320d48c2;p=llvm [X86] Use APInt instead of SmallBitVector for tracking undef elements in constant pool shuffle decoding Summary: SmallBitVector uses a malloc for more than 58 bits on a 64-bit target and more than 27 bits on a 32-bit target. Some of the vector types we deal with here use more than those number of elements and therefore cause a malloc. APInt on the other hand supports up to 64 bits without a malloc. That's the maximum number of bits we need here so we can avoid a malloc for all cases by using APInt. This will incur a minor increase in stack usage due to APInt storing the bit count separately from the data bits unlike SmallBitVector, but that should be ok. Reviewers: RKSimon Reviewed By: RKSimon Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D30386 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@296352 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp b/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp index c24b74f7480..3ce8609267f 100644 --- a/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp +++ b/lib/Target/X86/X86ShuffleDecodeConstantPool.cpp @@ -14,7 +14,7 @@ #include "X86ShuffleDecodeConstantPool.h" #include "Utils/X86ShuffleDecode.h" -#include "llvm/ADT/SmallBitVector.h" +#include "llvm/ADT/APInt.h" #include "llvm/CodeGen/MachineValueType.h" #include "llvm/IR/Constants.h" @@ -25,7 +25,7 @@ namespace llvm { static bool extractConstantMask(const Constant *C, unsigned MaskEltSizeInBits, - SmallBitVector &UndefElts, + APInt &UndefElts, SmallVectorImpl &RawMask) { // It is not an error for shuffle masks to not be a vector of // MaskEltSizeInBits because the constant pool uniques constants by their @@ -73,7 +73,7 @@ static bool extractConstantMask(const Constant *C, unsigned MaskEltSizeInBits, "Unaligned shuffle mask size"); unsigned NumMaskElts = CstSizeInBits / MaskEltSizeInBits; - UndefElts = SmallBitVector(NumMaskElts, false); + UndefElts = APInt(NumMaskElts, 0); RawMask.resize(NumMaskElts, 0); for (unsigned i = 0; i != NumMaskElts; ++i) { @@ -83,7 +83,7 @@ static bool extractConstantMask(const Constant *C, unsigned MaskEltSizeInBits, // Only treat the element as UNDEF if all bits are UNDEF, otherwise // treat it as zero. if (EltUndef.isAllOnesValue()) { - UndefElts[i] = true; + UndefElts.setBit(i); RawMask[i] = 0; continue; } @@ -103,7 +103,7 @@ void DecodePSHUFBMask(const Constant *C, SmallVectorImpl &ShuffleMask) { "Unexpected vector size."); // The shuffle mask requires a byte vector. - SmallBitVector UndefElts; + APInt UndefElts; SmallVector RawMask; if (!extractConstantMask(C, 8, UndefElts, RawMask)) return; @@ -144,7 +144,7 @@ void DecodeVPERMILPMask(const Constant *C, unsigned ElSize, assert((ElSize == 32 || ElSize == 64) && "Unexpected vector element size."); // The shuffle mask requires elements the same size as the target. - SmallBitVector UndefElts; + APInt UndefElts; SmallVector RawMask; if (!extractConstantMask(C, ElSize, UndefElts, RawMask)) return; @@ -179,7 +179,7 @@ void DecodeVPERMIL2PMask(const Constant *C, unsigned M2Z, unsigned ElSize, assert((MaskTySize == 128 || MaskTySize == 256) && "Unexpected vector size."); // The shuffle mask requires elements the same size as the target. - SmallBitVector UndefElts; + APInt UndefElts; SmallVector RawMask; if (!extractConstantMask(C, ElSize, UndefElts, RawMask)) return; @@ -230,7 +230,7 @@ void DecodeVPPERMMask(const Constant *C, SmallVectorImpl &ShuffleMask) { "Unexpected vector size."); // The shuffle mask requires a byte vector. - SmallBitVector UndefElts; + APInt UndefElts; SmallVector RawMask; if (!extractConstantMask(C, 8, UndefElts, RawMask)) return; @@ -285,7 +285,7 @@ void DecodeVPERMVMask(const Constant *C, unsigned ElSize, "Unexpected vector element size."); // The shuffle mask requires elements the same size as the target. - SmallBitVector UndefElts; + APInt UndefElts; SmallVector RawMask; if (!extractConstantMask(C, ElSize, UndefElts, RawMask)) return; @@ -313,7 +313,7 @@ void DecodeVPERMV3Mask(const Constant *C, unsigned ElSize, "Unexpected vector element size."); // The shuffle mask requires elements the same size as the target. - SmallBitVector UndefElts; + APInt UndefElts; SmallVector RawMask; if (!extractConstantMask(C, ElSize, UndefElts, RawMask)) return;