diff options
Diffstat (limited to 'llvm/lib/IR/Instructions.cpp')
-rw-r--r-- | llvm/lib/IR/Instructions.cpp | 19 |
1 files changed, 7 insertions, 12 deletions
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp index b299696..2d89ec1 100644 --- a/llvm/lib/IR/Instructions.cpp +++ b/llvm/lib/IR/Instructions.cpp @@ -1854,23 +1854,18 @@ void ShuffleVectorInst::getShuffleMask(const Constant *Mask, SmallVectorImpl<int> &Result) { ElementCount EC = cast<VectorType>(Mask->getType())->getElementCount(); - if (isa<ConstantAggregateZero>(Mask)) { - Result.resize(EC.getKnownMinValue(), 0); + if (isa<ConstantAggregateZero>(Mask) || isa<UndefValue>(Mask)) { + int MaskVal = isa<UndefValue>(Mask) ? -1 : 0; + Result.append(EC.getKnownMinValue(), MaskVal); return; } - Result.reserve(EC.getKnownMinValue()); + assert(!EC.isScalable() && + "Scalable vector shuffle mask must be undef or zeroinitializer"); - if (EC.isScalable()) { - assert((isa<ConstantAggregateZero>(Mask) || isa<UndefValue>(Mask)) && - "Scalable vector shuffle mask must be undef or zeroinitializer"); - int MaskVal = isa<UndefValue>(Mask) ? -1 : 0; - for (unsigned I = 0; I < EC.getKnownMinValue(); ++I) - Result.emplace_back(MaskVal); - return; - } + unsigned NumElts = EC.getFixedValue(); - unsigned NumElts = EC.getKnownMinValue(); + Result.reserve(NumElts); if (auto *CDS = dyn_cast<ConstantDataSequential>(Mask)) { for (unsigned i = 0; i != NumElts; ++i) |