mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-13 23:18:51 +00:00
[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
This commit is contained in:
parent
71bb1882b1
commit
4b7fe0758a
@ -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<uint64_t> &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<int> &ShuffleMask) {
|
||||
"Unexpected vector size.");
|
||||
|
||||
// The shuffle mask requires a byte vector.
|
||||
SmallBitVector UndefElts;
|
||||
APInt UndefElts;
|
||||
SmallVector<uint64_t, 32> 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<uint64_t, 8> 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<uint64_t, 8> RawMask;
|
||||
if (!extractConstantMask(C, ElSize, UndefElts, RawMask))
|
||||
return;
|
||||
@ -230,7 +230,7 @@ void DecodeVPPERMMask(const Constant *C, SmallVectorImpl<int> &ShuffleMask) {
|
||||
"Unexpected vector size.");
|
||||
|
||||
// The shuffle mask requires a byte vector.
|
||||
SmallBitVector UndefElts;
|
||||
APInt UndefElts;
|
||||
SmallVector<uint64_t, 32> 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<uint64_t, 8> 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<uint64_t, 8> RawMask;
|
||||
if (!extractConstantMask(C, ElSize, UndefElts, RawMask))
|
||||
return;
|
||||
|
Loading…
Reference in New Issue
Block a user