diff options
Diffstat (limited to 'llvm/lib/Transforms/Vectorize/VectorCombine.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Vectorize/VectorCombine.cpp | 85 |
1 files changed, 17 insertions, 68 deletions
diff --git a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp index 2e489757ebc1..13464c9d3496 100644 --- a/llvm/lib/Transforms/Vectorize/VectorCombine.cpp +++ b/llvm/lib/Transforms/Vectorize/VectorCombine.cpp @@ -25,11 +25,8 @@ #include "llvm/IR/Function.h" #include "llvm/IR/IRBuilder.h" #include "llvm/IR/PatternMatch.h" -#include "llvm/InitializePasses.h" -#include "llvm/Pass.h" #include "llvm/Support/CommandLine.h" #include "llvm/Transforms/Utils/Local.h" -#include "llvm/Transforms/Vectorize.h" #include <numeric> #define DEBUG_TYPE "vector-combine" @@ -247,7 +244,7 @@ bool VectorCombine::vectorizeLoadInsert(Instruction &I) { // still need a shuffle to change the vector size. auto *Ty = cast<FixedVectorType>(I.getType()); unsigned OutputNumElts = Ty->getNumElements(); - SmallVector<int, 16> Mask(OutputNumElts, UndefMaskElem); + SmallVector<int, 16> Mask(OutputNumElts, PoisonMaskElem); assert(OffsetEltIndex < MinVecNumElts && "Address offset too big"); Mask[0] = OffsetEltIndex; if (OffsetEltIndex) @@ -460,9 +457,9 @@ bool VectorCombine::isExtractExtractCheap(ExtractElementInst *Ext0, // If we are extracting from 2 different indexes, then one operand must be // shuffled before performing the vector operation. The shuffle mask is - // undefined except for 1 lane that is being translated to the remaining + // poison except for 1 lane that is being translated to the remaining // extraction lane. Therefore, it is a splat shuffle. Ex: - // ShufMask = { undef, undef, 0, undef } + // ShufMask = { poison, poison, 0, poison } // TODO: The cost model has an option for a "broadcast" shuffle // (splat-from-element-0), but no option for a more general splat. NewCost += @@ -479,11 +476,11 @@ bool VectorCombine::isExtractExtractCheap(ExtractElementInst *Ext0, /// to a new element location. static Value *createShiftShuffle(Value *Vec, unsigned OldIndex, unsigned NewIndex, IRBuilder<> &Builder) { - // The shuffle mask is undefined except for 1 lane that is being translated + // The shuffle mask is poison except for 1 lane that is being translated // to the new element index. Example for OldIndex == 2 and NewIndex == 0: - // ShufMask = { 2, undef, undef, undef } + // ShufMask = { 2, poison, poison, poison } auto *VecTy = cast<FixedVectorType>(Vec->getType()); - SmallVector<int, 32> ShufMask(VecTy->getNumElements(), UndefMaskElem); + SmallVector<int, 32> ShufMask(VecTy->getNumElements(), PoisonMaskElem); ShufMask[NewIndex] = OldIndex; return Builder.CreateShuffleVector(Vec, ShufMask, "shift"); } @@ -917,7 +914,7 @@ bool VectorCombine::foldExtractedCmps(Instruction &I) { auto *CmpTy = cast<FixedVectorType>(CmpInst::makeCmpResultType(X->getType())); InstructionCost NewCost = TTI.getCmpSelInstrCost( CmpOpcode, X->getType(), CmpInst::makeCmpResultType(X->getType()), Pred); - SmallVector<int, 32> ShufMask(VecTy->getNumElements(), UndefMaskElem); + SmallVector<int, 32> ShufMask(VecTy->getNumElements(), PoisonMaskElem); ShufMask[CheapIndex] = ExpensiveIndex; NewCost += TTI.getShuffleCost(TargetTransformInfo::SK_PermuteSingleSrc, CmpTy, ShufMask); @@ -932,7 +929,7 @@ bool VectorCombine::foldExtractedCmps(Instruction &I) { // Create a vector constant from the 2 scalar constants. SmallVector<Constant *, 32> CmpC(VecTy->getNumElements(), - UndefValue::get(VecTy->getElementType())); + PoisonValue::get(VecTy->getElementType())); CmpC[Index0] = C0; CmpC[Index1] = C1; Value *VCmp = Builder.CreateCmp(Pred, X, ConstantVector::get(CmpC)); @@ -1565,7 +1562,7 @@ bool VectorCombine::foldSelectShuffle(Instruction &I, bool FromReduction) { // Calculate our ReconstructMasks from the OrigReconstructMasks and the // modified order of the input shuffles. SmallVector<SmallVector<int>> ReconstructMasks; - for (auto Mask : OrigReconstructMasks) { + for (const auto &Mask : OrigReconstructMasks) { SmallVector<int> ReconstructMask; for (int M : Mask) { auto FindIndex = [](const SmallVector<std::pair<int, int>> &V, int M) { @@ -1596,12 +1593,12 @@ bool VectorCombine::foldSelectShuffle(Instruction &I, bool FromReduction) { V2B.push_back(GetBaseMaskValue(SVI1B, V2[I].first)); } while (V1A.size() < NumElts) { - V1A.push_back(UndefMaskElem); - V1B.push_back(UndefMaskElem); + V1A.push_back(PoisonMaskElem); + V1B.push_back(PoisonMaskElem); } while (V2A.size() < NumElts) { - V2A.push_back(UndefMaskElem); - V2B.push_back(UndefMaskElem); + V2A.push_back(PoisonMaskElem); + V2B.push_back(PoisonMaskElem); } auto AddShuffleCost = [&](InstructionCost C, Instruction *I) { @@ -1660,16 +1657,16 @@ bool VectorCombine::foldSelectShuffle(Instruction &I, bool FromReduction) { return SSV->getOperand(Op); return SV->getOperand(Op); }; - Builder.SetInsertPoint(SVI0A->getNextNode()); + Builder.SetInsertPoint(SVI0A->getInsertionPointAfterDef()); Value *NSV0A = Builder.CreateShuffleVector(GetShuffleOperand(SVI0A, 0), GetShuffleOperand(SVI0A, 1), V1A); - Builder.SetInsertPoint(SVI0B->getNextNode()); + Builder.SetInsertPoint(SVI0B->getInsertionPointAfterDef()); Value *NSV0B = Builder.CreateShuffleVector(GetShuffleOperand(SVI0B, 0), GetShuffleOperand(SVI0B, 1), V1B); - Builder.SetInsertPoint(SVI1A->getNextNode()); + Builder.SetInsertPoint(SVI1A->getInsertionPointAfterDef()); Value *NSV1A = Builder.CreateShuffleVector(GetShuffleOperand(SVI1A, 0), GetShuffleOperand(SVI1A, 1), V2A); - Builder.SetInsertPoint(SVI1B->getNextNode()); + Builder.SetInsertPoint(SVI1B->getInsertionPointAfterDef()); Value *NSV1B = Builder.CreateShuffleVector(GetShuffleOperand(SVI1B, 0), GetShuffleOperand(SVI1B, 1), V2B); Builder.SetInsertPoint(Op0); @@ -1811,54 +1808,6 @@ bool VectorCombine::run() { return MadeChange; } -// Pass manager boilerplate below here. - -namespace { -class VectorCombineLegacyPass : public FunctionPass { -public: - static char ID; - VectorCombineLegacyPass() : FunctionPass(ID) { - initializeVectorCombineLegacyPassPass(*PassRegistry::getPassRegistry()); - } - - void getAnalysisUsage(AnalysisUsage &AU) const override { - AU.addRequired<AssumptionCacheTracker>(); - AU.addRequired<DominatorTreeWrapperPass>(); - AU.addRequired<TargetTransformInfoWrapperPass>(); - AU.addRequired<AAResultsWrapperPass>(); - AU.setPreservesCFG(); - AU.addPreserved<DominatorTreeWrapperPass>(); - AU.addPreserved<GlobalsAAWrapperPass>(); - AU.addPreserved<AAResultsWrapperPass>(); - AU.addPreserved<BasicAAWrapperPass>(); - FunctionPass::getAnalysisUsage(AU); - } - - bool runOnFunction(Function &F) override { - if (skipFunction(F)) - return false; - auto &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F); - auto &TTI = getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F); - auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree(); - auto &AA = getAnalysis<AAResultsWrapperPass>().getAAResults(); - VectorCombine Combiner(F, TTI, DT, AA, AC, false); - return Combiner.run(); - } -}; -} // namespace - -char VectorCombineLegacyPass::ID = 0; -INITIALIZE_PASS_BEGIN(VectorCombineLegacyPass, "vector-combine", - "Optimize scalar/vector ops", false, - false) -INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker) -INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) -INITIALIZE_PASS_END(VectorCombineLegacyPass, "vector-combine", - "Optimize scalar/vector ops", false, false) -Pass *llvm::createVectorCombinePass() { - return new VectorCombineLegacyPass(); -} - PreservedAnalyses VectorCombinePass::run(Function &F, FunctionAnalysisManager &FAM) { auto &AC = FAM.getResult<AssumptionAnalysis>(F); |
