[llvm] r263656 - [SLP] Make DataLayout a member variable.
Eric Christopher via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 16 22:42:30 PDT 2016
If you don't expect it to ever be null you could probably make it a
reference :)
-eric
On Wed, Mar 16, 2016 at 12:54 PM Chad Rosier via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: mcrosier
> Date: Wed Mar 16 14:48:42 2016
> New Revision: 263656
>
> URL: http://llvm.org/viewvc/llvm-project?rev=263656&view=rev
> Log:
> [SLP] Make DataLayout a member variable.
>
> Modified:
> llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp
>
> Modified: llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp?rev=263656&r1=263655&r2=263656&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp (original)
> +++ llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp Wed Mar 16
> 14:48:42 2016
> @@ -368,10 +368,11 @@ public:
>
> BoUpSLP(Function *Func, ScalarEvolution *Se, TargetTransformInfo *Tti,
> TargetLibraryInfo *TLi, AliasAnalysis *Aa, LoopInfo *Li,
> - DominatorTree *Dt, AssumptionCache *AC, DemandedBits *DB)
> + DominatorTree *Dt, AssumptionCache *AC, DemandedBits *DB,
> + const DataLayout *DL)
> : NumLoadsWantToKeepOrder(0), NumLoadsWantToChangeOrder(0), F(Func),
> SE(Se), TTI(Tti), TLI(TLi), AA(Aa), LI(Li), DT(Dt), AC(AC),
> DB(DB),
> - Builder(Se->getContext()) {
> + DL(DL), Builder(Se->getContext()) {
> CodeMetrics::collectEphemeralValues(F, AC, EphValues);
> }
>
> @@ -925,6 +926,7 @@ private:
> DominatorTree *DT;
> AssumptionCache *AC;
> DemandedBits *DB;
> + const DataLayout *DL;
> /// Instruction builder to construct the vectorized tree.
> IRBuilder<> Builder;
>
> @@ -1176,11 +1178,10 @@ void BoUpSLP::buildTree_rec(ArrayRef<Val
> // loading/storing it as an i8 struct. If we vectorize loads/stores
> from
> // such a struct we read/write packed bits disagreeing with the
> // unvectorized version.
> - const DataLayout &DL = F->getParent()->getDataLayout();
> Type *ScalarTy = VL[0]->getType();
>
> - if (DL.getTypeSizeInBits(ScalarTy) !=
> - DL.getTypeAllocSizeInBits(ScalarTy)) {
> + if (DL->getTypeSizeInBits(ScalarTy) !=
> + DL->getTypeAllocSizeInBits(ScalarTy)) {
> BS.cancelScheduling(VL);
> newTreeEntry(VL, false);
> DEBUG(dbgs() << "SLP: Gathering loads of non-packed type.\n");
> @@ -1196,8 +1197,8 @@ void BoUpSLP::buildTree_rec(ArrayRef<Val
> return;
> }
>
> - if (!isConsecutiveAccess(VL[i], VL[i + 1], DL, *SE)) {
> - if (VL.size() == 2 && isConsecutiveAccess(VL[1], VL[0], DL,
> *SE)) {
> + if (!isConsecutiveAccess(VL[i], VL[i + 1], *DL, *SE)) {
> + if (VL.size() == 2 && isConsecutiveAccess(VL[1], VL[0], *DL,
> *SE)) {
> ++NumLoadsWantToChangeOrder;
> }
> BS.cancelScheduling(VL);
> @@ -1366,10 +1367,9 @@ void BoUpSLP::buildTree_rec(ArrayRef<Val
> return;
> }
> case Instruction::Store: {
> - const DataLayout &DL = F->getParent()->getDataLayout();
> // Check if the stores are consecutive or of we need to swizzle
> them.
> for (unsigned i = 0, e = VL.size() - 1; i < e; ++i)
> - if (!isConsecutiveAccess(VL[i], VL[i + 1], DL, *SE)) {
> + if (!isConsecutiveAccess(VL[i], VL[i + 1], *DL, *SE)) {
> BS.cancelScheduling(VL);
> newTreeEntry(VL, false);
> DEBUG(dbgs() << "SLP: Non-consecutive store.\n");
> @@ -1872,8 +1872,6 @@ int BoUpSLP::getGatherCost(ArrayRef<Valu
> void BoUpSLP::reorderAltShuffleOperands(ArrayRef<Value *> VL,
> SmallVectorImpl<Value *> &Left,
> SmallVectorImpl<Value *> &Right) {
> - const DataLayout &DL = F->getParent()->getDataLayout();
> -
> // Push left and right operands of binary operation into Left and Right
> for (unsigned i = 0, e = VL.size(); i < e; ++i) {
> Left.push_back(cast<Instruction>(VL[i])->getOperand(0));
> @@ -1887,10 +1885,11 @@ void BoUpSLP::reorderAltShuffleOperands(
> if (LoadInst *L1 = dyn_cast<LoadInst>(Right[j + 1])) {
> Instruction *VL1 = cast<Instruction>(VL[j]);
> Instruction *VL2 = cast<Instruction>(VL[j + 1]);
> - if (VL1->isCommutative() && isConsecutiveAccess(L, L1, DL, *SE)) {
> + if (VL1->isCommutative() && isConsecutiveAccess(L, L1, *DL, *SE))
> {
> std::swap(Left[j], Right[j]);
> continue;
> - } else if (VL2->isCommutative() && isConsecutiveAccess(L, L1, DL,
> *SE)) {
> + } else if (VL2->isCommutative() &&
> + isConsecutiveAccess(L, L1, *DL, *SE)) {
> std::swap(Left[j + 1], Right[j + 1]);
> continue;
> }
> @@ -1901,10 +1900,11 @@ void BoUpSLP::reorderAltShuffleOperands(
> if (LoadInst *L1 = dyn_cast<LoadInst>(Left[j + 1])) {
> Instruction *VL1 = cast<Instruction>(VL[j]);
> Instruction *VL2 = cast<Instruction>(VL[j + 1]);
> - if (VL1->isCommutative() && isConsecutiveAccess(L, L1, DL, *SE)) {
> + if (VL1->isCommutative() && isConsecutiveAccess(L, L1, *DL, *SE))
> {
> std::swap(Left[j], Right[j]);
> continue;
> - } else if (VL2->isCommutative() && isConsecutiveAccess(L, L1, DL,
> *SE)) {
> + } else if (VL2->isCommutative() &&
> + isConsecutiveAccess(L, L1, *DL, *SE)) {
> std::swap(Left[j + 1], Right[j + 1]);
> continue;
> }
> @@ -2034,8 +2034,6 @@ void BoUpSLP::reorderInputsAccordingToOp
> if (SplatRight || SplatLeft)
> return;
>
> - const DataLayout &DL = F->getParent()->getDataLayout();
> -
> // Finally check if we can get longer vectorizable chain by reordering
> // without breaking the good operand order detected above.
> // E.g. If we have something like-
> @@ -2054,7 +2052,7 @@ void BoUpSLP::reorderInputsAccordingToOp
> for (unsigned j = 0; j < VL.size() - 1; ++j) {
> if (LoadInst *L = dyn_cast<LoadInst>(Left[j])) {
> if (LoadInst *L1 = dyn_cast<LoadInst>(Right[j + 1])) {
> - if (isConsecutiveAccess(L, L1, DL, *SE)) {
> + if (isConsecutiveAccess(L, L1, *DL, *SE)) {
> std::swap(Left[j + 1], Right[j + 1]);
> continue;
> }
> @@ -2062,7 +2060,7 @@ void BoUpSLP::reorderInputsAccordingToOp
> }
> if (LoadInst *L = dyn_cast<LoadInst>(Right[j])) {
> if (LoadInst *L1 = dyn_cast<LoadInst>(Left[j + 1])) {
> - if (isConsecutiveAccess(L, L1, DL, *SE)) {
> + if (isConsecutiveAccess(L, L1, *DL, *SE)) {
> std::swap(Left[j + 1], Right[j + 1]);
> continue;
> }
> @@ -2158,7 +2156,6 @@ Value *BoUpSLP::vectorizeTree(TreeEntry
> return Gather(E->Scalars, VecTy);
> }
>
> - const DataLayout &DL = F->getParent()->getDataLayout();
> unsigned Opcode = getSameOpcode(E->Scalars);
>
> switch (Opcode) {
> @@ -2355,7 +2352,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry
> unsigned Alignment = LI->getAlignment();
> LI = Builder.CreateLoad(VecPtr);
> if (!Alignment) {
> - Alignment = DL.getABITypeAlignment(ScalarLoadTy);
> + Alignment = DL->getABITypeAlignment(ScalarLoadTy);
> }
> LI->setAlignment(Alignment);
> E->VectorizedValue = LI;
> @@ -2386,7 +2383,7 @@ Value *BoUpSLP::vectorizeTree(TreeEntry
> ExternalUser(SI->getPointerOperand(), cast<User>(VecPtr), 0));
>
> if (!Alignment) {
> - Alignment =
> DL.getABITypeAlignment(SI->getValueOperand()->getType());
> + Alignment =
> DL->getABITypeAlignment(SI->getValueOperand()->getType());
> }
> S->setAlignment(Alignment);
> E->VectorizedValue = S;
> @@ -3133,12 +3130,10 @@ void BoUpSLP::scheduleBlock(BlockSchedul
> }
>
> unsigned BoUpSLP::getVectorElementSize(Value *V) {
> - auto &DL = F->getParent()->getDataLayout();
> -
> // If V is a store, just return the width of the stored value without
> // traversing the expression tree. This is the common case.
> if (auto *Store = dyn_cast<StoreInst>(V))
> - return DL.getTypeSizeInBits(Store->getValueOperand()->getType());
> + return DL->getTypeSizeInBits(Store->getValueOperand()->getType());
>
> // If V is not a store, we can traverse the expression tree to find
> loads
> // that feed it. The type of the loaded value may indicate a more
> suitable
> @@ -3166,7 +3161,7 @@ unsigned BoUpSLP::getVectorElementSize(V
> // If the current instruction is a load, update MaxWidth to reflect
> the
> // width of the loaded value.
> else if (isa<LoadInst>(I))
> - MaxWidth = std::max<unsigned>(MaxWidth, DL.getTypeSizeInBits(Ty));
> + MaxWidth = std::max<unsigned>(MaxWidth, DL->getTypeSizeInBits(Ty));
>
> // Otherwise, we need to visit the operands of the instruction. We
> only
> // handle the interesting cases from buildTree here. If an operand is
> an
> @@ -3187,7 +3182,7 @@ unsigned BoUpSLP::getVectorElementSize(V
> // If we didn't encounter a memory access in the expression tree, or if
> we
> // gave up for some reason, just return the width of V.
> if (!MaxWidth || FoundUnknownInst)
> - return DL.getTypeSizeInBits(V->getType());
> + return DL->getTypeSizeInBits(V->getType());
>
> // Otherwise, return the maximum width we found.
> return MaxWidth;
> @@ -3265,8 +3260,6 @@ static bool collectValuesToDemote(Value
> }
>
> void BoUpSLP::computeMinimumValueSizes() {
> - auto &DL = F->getParent()->getDataLayout();
> -
> // If there are no external uses, the expression tree must be rooted by
> a
> // store. We can't demote in-memory values, so there is nothing to do
> here.
> if (ExternalUses.empty())
> @@ -3334,11 +3327,11 @@ void BoUpSLP::computeMinimumValueSizes()
> // We start by looking at each entry that can be demoted. We compute the
> // maximum bit width required to store the scalar by using
> ValueTracking to
> // compute the number of high-order bits we can truncate.
> - if (MaxBitWidth == DL.getTypeSizeInBits(TreeRoot[0]->getType())) {
> + if (MaxBitWidth == DL->getTypeSizeInBits(TreeRoot[0]->getType())) {
> MaxBitWidth = 8u;
> for (auto *Scalar : ToDemote) {
> - auto NumSignBits = ComputeNumSignBits(Scalar, DL, 0, AC, 0, DT);
> - auto NumTypeBits = DL.getTypeSizeInBits(Scalar->getType());
> + auto NumSignBits = ComputeNumSignBits(Scalar, *DL, 0, AC, 0, DT);
> + auto NumTypeBits = DL->getTypeSizeInBits(Scalar->getType());
> MaxBitWidth = std::max<unsigned>(NumTypeBits - NumSignBits,
> MaxBitWidth);
> }
> }
> @@ -3385,6 +3378,12 @@ struct SLPVectorizer : public FunctionPa
> DominatorTree *DT;
> AssumptionCache *AC;
> DemandedBits *DB;
> + const DataLayout *DL;
> +
> + bool doInitialization(Module &M) override {
> + DL = &M.getDataLayout();
> + return false;
> + }
>
> bool runOnFunction(Function &F) override {
> if (skipOptnoneFunction(F))
> @@ -3430,7 +3429,7 @@ struct SLPVectorizer : public FunctionPa
>
> // Use the bottom up slp vectorizer to construct chains that start
> with
> // store instructions.
> - BoUpSLP R(&F, SE, TTI, TLI, AA, LI, DT, AC, DB);
> + BoUpSLP R(&F, SE, TTI, TLI, AA, LI, DT, AC, DB, DL);
>
> // A general note: the vectorizer must use
> BoUpSLP::eraseInstruction() to
> // delete instructions.
> @@ -3611,7 +3610,6 @@ bool SLPVectorizer::vectorizeStores(Arra
> // all of the pairs of stores that follow each other.
> SmallVector<unsigned, 16> IndexQueue;
> for (unsigned i = 0, e = Stores.size(); i < e; ++i) {
> - const DataLayout &DL = Stores[i]->getModule()->getDataLayout();
> IndexQueue.clear();
> // If a store has multiple consecutive store candidates, search Stores
> // array according to the sequence: from i+1 to e, then from i-1 to 0.
> @@ -3624,7 +3622,7 @@ bool SLPVectorizer::vectorizeStores(Arra
> IndexQueue.push_back(j - 1);
>
> for (auto &k : IndexQueue) {
> - if (isConsecutiveAccess(Stores[i], Stores[k], DL, *SE)) {
> + if (isConsecutiveAccess(Stores[i], Stores[k], *DL, *SE)) {
> Tails.insert(Stores[k]);
> Heads.insert(Stores[i]);
> ConsecutiveChain[Stores[i]] = Stores[k];
> @@ -3673,7 +3671,6 @@ void SLPVectorizer::collectSeedInstructi
> Stores.clear();
> GEPs.clear();
> NumStores = NumGEPs = 0;
> - const DataLayout &DL = BB->getModule()->getDataLayout();
>
> // Visit the store and getelementptr instructions in BB and organize
> them in
> // Stores and GEPs according to the underlying objects of their pointer
> @@ -3687,7 +3684,7 @@ void SLPVectorizer::collectSeedInstructi
> continue;
> if (!isValidElementType(SI->getValueOperand()->getType()))
> continue;
> - Stores[GetUnderlyingObject(SI->getPointerOperand(),
> DL)].push_back(SI);
> + Stores[GetUnderlyingObject(SI->getPointerOperand(),
> *DL)].push_back(SI);
> ++NumStores;
> }
>
> @@ -3700,7 +3697,7 @@ void SLPVectorizer::collectSeedInstructi
> continue;
> if (!isValidElementType(Idx->getType()))
> continue;
> - GEPs[GetUnderlyingObject(GEP->getPointerOperand(),
> DL)].push_back(GEP);
> + GEPs[GetUnderlyingObject(GEP->getPointerOperand(),
> *DL)].push_back(GEP);
> ++NumGEPs;
> }
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160317/f91eaf37/attachment.html>
More information about the llvm-commits
mailing list