From 9841605a5a985251918022a9ddb0ed6a1c294100 Mon Sep 17 00:00:00 2001 From: "Arch D. Robison" Date: Wed, 27 Apr 2016 17:46:25 +0000 Subject: [PATCH] [SLPVectorizer] Refactor where MinVecRegSize and MaxVecRegSize live. This is the first of two commits for extending SLP Vectorizer to deal with aggregates. This commit merely refactors existing logic. http://reviews.llvm.org/D14185 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@267748 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Vectorize/SLPVectorizer.cpp | 48 +++++++++++++++++------------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/lib/Transforms/Vectorize/SLPVectorizer.cpp b/lib/Transforms/Vectorize/SLPVectorizer.cpp index b92a97556aa..df061118878 100644 --- a/lib/Transforms/Vectorize/SLPVectorizer.cpp +++ b/lib/Transforms/Vectorize/SLPVectorizer.cpp @@ -373,6 +373,18 @@ public: SE(Se), TTI(Tti), TLI(TLi), AA(Aa), LI(Li), DT(Dt), AC(AC), DB(DB), DL(DL), Builder(Se->getContext()) { CodeMetrics::collectEphemeralValues(F, AC, EphValues); + // Use the vector register size specified by the target unless overridden + // by a command-line option. + // TODO: It would be better to limit the vectorization factor based on + // data type rather than just register size. For example, x86 AVX has + // 256-bit registers, but it does not support integer operations + // at that width (that requires AVX2). + if (MaxVectorRegSizeOption.getNumOccurrences()) + MaxVecRegSize = MaxVectorRegSizeOption; + else + MaxVecRegSize = TTI->getRegisterBitWidth(true); + + MinVecRegSize = MinVectorRegSizeOption; } /// \brief Vectorize the tree that starts with the elements in \p VL. @@ -426,6 +438,16 @@ public: /// vectorizable tree. void computeMinimumValueSizes(); + // \returns maximum vector register size as set by TTI or overridden by cl::opt. + unsigned getMaxVecRegSize() const { + return MaxVecRegSize; + } + + // \returns minimum vector register size as set by cl::opt. + unsigned getMinVecRegSize() const { + return MinVecRegSize; + } + private: struct TreeEntry; @@ -926,6 +948,8 @@ private: AssumptionCache *AC; DemandedBits *DB; const DataLayout *DL; + unsigned MaxVecRegSize; // This is set by TTI or overridden by cl::opt. + unsigned MinVecRegSize; // Set by cl::opt (default: 128). /// Instruction builder to construct the vectorized tree. IRBuilder<> Builder; @@ -3419,19 +3443,6 @@ struct SLPVectorizer : public FunctionPass { if (!TTI->getNumberOfRegisters(true)) return false; - // Use the vector register size specified by the target unless overridden - // by a command-line option. - // TODO: It would be better to limit the vectorization factor based on - // data type rather than just register size. For example, x86 AVX has - // 256-bit registers, but it does not support integer operations - // at that width (that requires AVX2). - if (MaxVectorRegSizeOption.getNumOccurrences()) - MaxVecRegSize = MaxVectorRegSizeOption; - else - MaxVecRegSize = TTI->getRegisterBitWidth(true); - - MinVecRegSize = MinVectorRegSizeOption; - // Don't vectorize when the attribute NoImplicitFloat is used. if (F.hasFnAttribute(Attribute::NoImplicitFloat)) return false; @@ -3539,9 +3550,6 @@ private: /// The getelementptr instructions in a basic block organized by base pointer. WeakVHListMap GEPs; - - unsigned MaxVecRegSize; // This is set by TTI or overridden by cl::opt. - unsigned MinVecRegSize; // Set by cl::opt (default: 128). }; /// \brief Check that the Values in the slice in VL array are still existent in @@ -3659,7 +3667,7 @@ bool SLPVectorizer::vectorizeStores(ArrayRef Stores, // FIXME: Is division-by-2 the correct step? Should we assert that the // register size is a power-of-2? - for (unsigned Size = MaxVecRegSize; Size >= MinVecRegSize; Size /= 2) { + for (unsigned Size = R.getMaxVecRegSize(); Size >= R.getMinVecRegSize(); Size /= 2) { if (vectorizeStoreChain(Operands, costThreshold, R, Size)) { // Mark the vectorized stores so that we don't vectorize them again. VectorizedStores.insert(Operands.begin(), Operands.end()); @@ -3732,7 +3740,7 @@ bool SLPVectorizer::tryToVectorizeList(ArrayRef VL, BoUpSLP &R, // FIXME: Register size should be a parameter to this function, so we can // try different vectorization factors. unsigned Sz = R.getVectorElementSize(I0); - unsigned VF = MinVecRegSize / Sz; + unsigned VF = R.getMinVecRegSize() / Sz; for (Value *V : VL) { Type *Ty = V->getType(); @@ -4358,7 +4366,7 @@ bool SLPVectorizer::vectorizeChainsInBlock(BasicBlock *BB, BoUpSLP &R) { continue; // Try to match and vectorize a horizontal reduction. - if (canMatchHorizontalReduction(P, BI, R, TTI, MinVecRegSize)) { + if (canMatchHorizontalReduction(P, BI, R, TTI, R.getMinVecRegSize())) { Changed = true; it = BB->begin(); e = BB->end(); @@ -4386,7 +4394,7 @@ bool SLPVectorizer::vectorizeChainsInBlock(BasicBlock *BB, BoUpSLP &R) { if (BinaryOperator *BinOp = dyn_cast(SI->getValueOperand())) { if (canMatchHorizontalReduction(nullptr, BinOp, R, TTI, - MinVecRegSize) || + R.getMinVecRegSize()) || tryToVectorize(BinOp, R)) { Changed = true; it = BB->begin(); -- 2.11.0