diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp b/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp index 4e1b4e87ebc95..4412b3079461c 100644 --- a/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp +++ b/llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp @@ -38,7 +38,6 @@ #include "llvm/Analysis/MemorySSA.h" #include "llvm/Analysis/ProfileSummaryInfo.h" #include "llvm/Analysis/ScalarEvolution.h" -#include "llvm/Analysis/ScalarEvolutionExpander.h" #include "llvm/Analysis/ScalarEvolutionExpressions.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/TargetTransformInfo.h" @@ -58,6 +57,7 @@ #include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/Utils.h" #include "llvm/Transforms/Utils/LoopVersioning.h" +#include "llvm/Transforms/Utils/ScalarEvolutionExpander.h" #include "llvm/Transforms/Utils/SizeOpts.h" #include <algorithm> #include <cassert> @@ -377,7 +377,7 @@ public: /// Determine the pointer alias checks to prove that there are no /// intervening stores. - SmallVector<RuntimePointerChecking::PointerCheck, 4> collectMemchecks( + SmallVector<RuntimePointerCheck, 4> collectMemchecks( const SmallVectorImpl<StoreToLoadForwardingCandidate> &Candidates) { SmallPtrSet<Value *, 4> PtrsWrittenOnFwdingPath = @@ -391,10 +391,10 @@ public: std::mem_fn(&StoreToLoadForwardingCandidate::getLoadPtr)); const auto &AllChecks = LAI.getRuntimePointerChecking()->getChecks(); - SmallVector<RuntimePointerChecking::PointerCheck, 4> Checks; + SmallVector<RuntimePointerCheck, 4> Checks; copy_if(AllChecks, std::back_inserter(Checks), - [&](const RuntimePointerChecking::PointerCheck &Check) { + [&](const RuntimePointerCheck &Check) { for (auto PtrIdx1 : Check.first->Members) for (auto PtrIdx2 : Check.second->Members) if (needsChecking(PtrIdx1, PtrIdx2, PtrsWrittenOnFwdingPath, @@ -432,12 +432,12 @@ public: Value *Ptr = Cand.Load->getPointerOperand(); auto *PtrSCEV = cast<SCEVAddRecExpr>(PSE.getSCEV(Ptr)); auto *PH = L->getLoopPreheader(); + assert(PH && "Preheader should exist!"); Value *InitialPtr = SEE.expandCodeFor(PtrSCEV->getStart(), Ptr->getType(), PH->getTerminator()); Value *Initial = new LoadInst( Cand.Load->getType(), InitialPtr, "load_initial", - /* isVolatile */ false, MaybeAlign(Cand.Load->getAlignment()), - PH->getTerminator()); + /* isVolatile */ false, Cand.Load->getAlign(), PH->getTerminator()); PHINode *PHI = PHINode::Create(Initial->getType(), 2, "store_forwarded", &L->getHeader()->front()); @@ -520,8 +520,7 @@ public: // Check intervening may-alias stores. These need runtime checks for alias // disambiguation. - SmallVector<RuntimePointerChecking::PointerCheck, 4> Checks = - collectMemchecks(Candidates); + SmallVector<RuntimePointerCheck, 4> Checks = collectMemchecks(Candidates); // Too many checks are likely to outweigh the benefits of forwarding. if (Checks.size() > Candidates.size() * CheckPerElim) { @@ -535,6 +534,11 @@ public: return false; } + if (!L->isLoopSimplifyForm()) { + LLVM_DEBUG(dbgs() << "Loop is not is loop-simplify form"); + return false; + } + if (!Checks.empty() || !LAI.getPSE().getUnionPredicate().isAlwaysTrue()) { if (LAI.hasConvergentOp()) { LLVM_DEBUG(dbgs() << "Versioning is needed but not allowed with " @@ -554,11 +558,6 @@ public: return false; } - if (!L->isLoopSimplifyForm()) { - LLVM_DEBUG(dbgs() << "Loop is not is loop-simplify form"); - return false; - } - // Point of no-return, start the transformation. First, version the loop // if necessary. @@ -697,8 +696,8 @@ PreservedAnalyses LoopLoadEliminationPass::run(Function &F, auto &TLI = AM.getResult<TargetLibraryAnalysis>(F); auto &AA = AM.getResult<AAManager>(F); auto &AC = AM.getResult<AssumptionAnalysis>(F); - auto &MAM = AM.getResult<ModuleAnalysisManagerFunctionProxy>(F).getManager(); - auto *PSI = MAM.getCachedResult<ProfileSummaryAnalysis>(*F.getParent()); + auto &MAMProxy = AM.getResult<ModuleAnalysisManagerFunctionProxy>(F); + auto *PSI = MAMProxy.getCachedResult<ProfileSummaryAnalysis>(*F.getParent()); auto *BFI = (PSI && PSI->hasProfileSummary()) ? &AM.getResult<BlockFrequencyAnalysis>(F) : nullptr; MemorySSA *MSSA = EnableMSSALoopDependency |