Skip to content

Commit 825e169

Browse files
committed
[LAA] Pass LoopAccessInfoManager instead of GetLAA function.
Use LoopAccessInfoManager directly instead of various GetLAA lambdas. Depends on D134608. Reviewed By: aeubanks Differential Revision: https://reviews.llvm.org/D134609
1 parent 75b18ba commit 825e169

File tree

9 files changed

+67
-88
lines changed

9 files changed

+67
-88
lines changed

llvm/include/llvm/Analysis/LoopAccessAnalysis.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -802,10 +802,11 @@ class LoopAccessLegacyAnalysis : public FunctionPass {
802802

803803
void getAnalysisUsage(AnalysisUsage &AU) const override;
804804

805-
/// Query the result of the loop access information for the loop \p L.
805+
/// Return the proxy object for retrieving LoopAccessInfo for individual
806+
/// loops.
806807
///
807808
/// If there is no cached result available run the analysis.
808-
const LoopAccessInfo &getInfo(Loop *L) { return LAIs->getInfo(*L); }
809+
LoopAccessInfoManager &getLAIs() { return *LAIs; }
809810

810811
void releaseMemory() override {
811812
// Invalidate the cache when the pass is freed.

llvm/include/llvm/Transforms/Vectorize/LoopVectorizationLegality.h

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -240,16 +240,18 @@ class LoopVectorizationRequirements {
240240
/// induction variable and the different reduction variables.
241241
class LoopVectorizationLegality {
242242
public:
243-
LoopVectorizationLegality(
244-
Loop *L, PredicatedScalarEvolution &PSE, DominatorTree *DT,
245-
TargetTransformInfo *TTI, TargetLibraryInfo *TLI, AAResults *AA,
246-
Function *F, std::function<const LoopAccessInfo &(Loop &)> *GetLAA,
247-
LoopInfo *LI, OptimizationRemarkEmitter *ORE,
248-
LoopVectorizationRequirements *R, LoopVectorizeHints *H, DemandedBits *DB,
249-
AssumptionCache *AC, BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI)
250-
: TheLoop(L), LI(LI), PSE(PSE), TTI(TTI), TLI(TLI), DT(DT),
251-
GetLAA(GetLAA), ORE(ORE), Requirements(R), Hints(H), DB(DB), AC(AC),
252-
BFI(BFI), PSI(PSI) {}
243+
LoopVectorizationLegality(Loop *L, PredicatedScalarEvolution &PSE,
244+
DominatorTree *DT, TargetTransformInfo *TTI,
245+
TargetLibraryInfo *TLI, AAResults *AA, Function *F,
246+
LoopAccessInfoManager &LAIs, LoopInfo *LI,
247+
OptimizationRemarkEmitter *ORE,
248+
LoopVectorizationRequirements *R,
249+
LoopVectorizeHints *H, DemandedBits *DB,
250+
AssumptionCache *AC, BlockFrequencyInfo *BFI,
251+
ProfileSummaryInfo *PSI)
252+
: TheLoop(L), LI(LI), PSE(PSE), TTI(TTI), TLI(TLI), DT(DT), LAIs(LAIs),
253+
ORE(ORE), Requirements(R), Hints(H), DB(DB), AC(AC), BFI(BFI),
254+
PSI(PSI) {}
253255

254256
/// ReductionList contains the reduction descriptors for all
255257
/// of the reductions that were found in the loop.
@@ -486,10 +488,8 @@ class LoopVectorizationLegality {
486488
DominatorTree *DT;
487489

488490
// LoopAccess analysis.
489-
std::function<const LoopAccessInfo &(Loop &)> *GetLAA;
491+
LoopAccessInfoManager &LAIs;
490492

491-
// And the loop-accesses info corresponding to this loop. This pointer is
492-
// null until canVectorizeMemory sets it up.
493493
const LoopAccessInfo *LAI = nullptr;
494494

495495
/// Interface to emit optimization remarks.

llvm/include/llvm/Transforms/Vectorize/LoopVectorize.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class DemandedBits;
6969
class DominatorTree;
7070
class Function;
7171
class Loop;
72-
class LoopAccessInfo;
72+
class LoopAccessInfoManager;
7373
class LoopInfo;
7474
class OptimizationRemarkEmitter;
7575
class ProfileSummaryInfo;
@@ -180,7 +180,7 @@ struct LoopVectorizePass : public PassInfoMixin<LoopVectorizePass> {
180180
DemandedBits *DB;
181181
AAResults *AA;
182182
AssumptionCache *AC;
183-
std::function<const LoopAccessInfo &(Loop &)> *GetLAA;
183+
LoopAccessInfoManager *LAIs;
184184
OptimizationRemarkEmitter *ORE;
185185
ProfileSummaryInfo *PSI;
186186

@@ -193,8 +193,7 @@ struct LoopVectorizePass : public PassInfoMixin<LoopVectorizePass> {
193193
runImpl(Function &F, ScalarEvolution &SE_, LoopInfo &LI_,
194194
TargetTransformInfo &TTI_, DominatorTree &DT_,
195195
BlockFrequencyInfo &BFI_, TargetLibraryInfo *TLI_, DemandedBits &DB_,
196-
AAResults &AA_, AssumptionCache &AC_,
197-
std::function<const LoopAccessInfo &(Loop &)> &GetLAA_,
196+
AAResults &AA_, AssumptionCache &AC_, LoopAccessInfoManager &LAIs_,
198197
OptimizationRemarkEmitter &ORE_, ProfileSummaryInfo *PSI_);
199198

200199
bool processLoop(Loop *L);

llvm/lib/Transforms/Scalar/LoopDistribute.cpp

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -653,13 +653,14 @@ class MemoryInstructionDependences {
653653
class LoopDistributeForLoop {
654654
public:
655655
LoopDistributeForLoop(Loop *L, Function *F, LoopInfo *LI, DominatorTree *DT,
656-
ScalarEvolution *SE, OptimizationRemarkEmitter *ORE)
657-
: L(L), F(F), LI(LI), DT(DT), SE(SE), ORE(ORE) {
656+
ScalarEvolution *SE, LoopAccessInfoManager &LAIs,
657+
OptimizationRemarkEmitter *ORE)
658+
: L(L), F(F), LI(LI), DT(DT), SE(SE), LAIs(LAIs), ORE(ORE) {
658659
setForced();
659660
}
660661

661662
/// Try to distribute an inner-most loop.
662-
bool processLoop(std::function<const LoopAccessInfo &(Loop &)> &GetLAA) {
663+
bool processLoop() {
663664
assert(L->isInnermost() && "Only process inner loops.");
664665

665666
LLVM_DEBUG(dbgs() << "\nLDist: In \""
@@ -677,7 +678,7 @@ class LoopDistributeForLoop {
677678

678679
BasicBlock *PH = L->getLoopPreheader();
679680

680-
LAI = &GetLAA(*L);
681+
LAI = &LAIs.getInfo(*L);
681682

682683
// Currently, we only distribute to isolate the part of the loop with
683684
// dependence cycles to enable partial vectorization.
@@ -953,6 +954,7 @@ class LoopDistributeForLoop {
953954
const LoopAccessInfo *LAI = nullptr;
954955
DominatorTree *DT;
955956
ScalarEvolution *SE;
957+
LoopAccessInfoManager &LAIs;
956958
OptimizationRemarkEmitter *ORE;
957959

958960
/// Indicates whether distribution is forced to be enabled/disabled for
@@ -969,7 +971,7 @@ class LoopDistributeForLoop {
969971
/// Shared implementation between new and old PMs.
970972
static bool runImpl(Function &F, LoopInfo *LI, DominatorTree *DT,
971973
ScalarEvolution *SE, OptimizationRemarkEmitter *ORE,
972-
std::function<const LoopAccessInfo &(Loop &)> &GetLAA) {
974+
LoopAccessInfoManager &LAIs) {
973975
// Build up a worklist of inner-loops to vectorize. This is necessary as the
974976
// act of distributing a loop creates new loops and can invalidate iterators
975977
// across the loops.
@@ -984,12 +986,12 @@ static bool runImpl(Function &F, LoopInfo *LI, DominatorTree *DT,
984986
// Now walk the identified inner loops.
985987
bool Changed = false;
986988
for (Loop *L : Worklist) {
987-
LoopDistributeForLoop LDL(L, &F, LI, DT, SE, ORE);
989+
LoopDistributeForLoop LDL(L, &F, LI, DT, SE, LAIs, ORE);
988990

989991
// If distribution was forced for the specific loop to be
990992
// enabled/disabled, follow that. Otherwise use the global flag.
991993
if (LDL.isForced().value_or(EnableLoopDistribute))
992-
Changed |= LDL.processLoop(GetLAA);
994+
Changed |= LDL.processLoop();
993995
}
994996

995997
// Process each loop nest in the function.
@@ -1013,14 +1015,12 @@ class LoopDistributeLegacy : public FunctionPass {
10131015
return false;
10141016

10151017
auto *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
1016-
auto *LAA = &getAnalysis<LoopAccessLegacyAnalysis>();
10171018
auto *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
10181019
auto *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
10191020
auto *ORE = &getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE();
1020-
std::function<const LoopAccessInfo &(Loop &)> GetLAA =
1021-
[&](Loop &L) -> const LoopAccessInfo & { return LAA->getInfo(&L); };
1021+
auto &LAIs = getAnalysis<LoopAccessLegacyAnalysis>().getLAIs();
10221022

1023-
return runImpl(F, LI, DT, SE, ORE, GetLAA);
1023+
return runImpl(F, LI, DT, SE, ORE, LAIs);
10241024
}
10251025

10261026
void getAnalysisUsage(AnalysisUsage &AU) const override {
@@ -1045,10 +1045,7 @@ PreservedAnalyses LoopDistributePass::run(Function &F,
10451045
auto &ORE = AM.getResult<OptimizationRemarkEmitterAnalysis>(F);
10461046

10471047
LoopAccessInfoManager &LAIs = AM.getResult<LoopAccessAnalysis>(F);
1048-
std::function<const LoopAccessInfo &(Loop &)> GetLAA =
1049-
[&](Loop &L) -> const LoopAccessInfo & { return LAIs.getInfo(L); };
1050-
1051-
bool Changed = runImpl(F, &LI, &DT, &SE, &ORE, GetLAA);
1048+
bool Changed = runImpl(F, &LI, &DT, &SE, &ORE, LAIs);
10521049
if (!Changed)
10531050
return PreservedAnalyses::all();
10541051
PreservedAnalyses PA;

llvm/lib/Transforms/Scalar/LoopLoadElimination.cpp

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -621,11 +621,12 @@ class LoadEliminationForLoop {
621621

622622
} // end anonymous namespace
623623

624-
static bool
625-
eliminateLoadsAcrossLoops(Function &F, LoopInfo &LI, DominatorTree &DT,
626-
BlockFrequencyInfo *BFI, ProfileSummaryInfo *PSI,
627-
ScalarEvolution *SE, AssumptionCache *AC,
628-
function_ref<const LoopAccessInfo &(Loop &)> GetLAI) {
624+
static bool eliminateLoadsAcrossLoops(Function &F, LoopInfo &LI,
625+
DominatorTree &DT,
626+
BlockFrequencyInfo *BFI,
627+
ProfileSummaryInfo *PSI,
628+
ScalarEvolution *SE, AssumptionCache *AC,
629+
LoopAccessInfoManager &LAIs) {
629630
// Build up a worklist of inner-loops to transform to avoid iterator
630631
// invalidation.
631632
// FIXME: This logic comes from other passes that actually change the loop
@@ -649,7 +650,7 @@ eliminateLoadsAcrossLoops(Function &F, LoopInfo &LI, DominatorTree &DT,
649650
if (!L->isRotatedForm() || !L->getExitingBlock())
650651
continue;
651652
// The actual work is performed by LoadEliminationForLoop.
652-
LoadEliminationForLoop LEL(L, &LI, GetLAI(*L), &DT, BFI, PSI);
653+
LoadEliminationForLoop LEL(L, &LI, LAIs.getInfo(*L), &DT, BFI, PSI);
653654
Changed |= LEL.processLoop();
654655
}
655656
return Changed;
@@ -672,7 +673,7 @@ class LoopLoadElimination : public FunctionPass {
672673
return false;
673674

674675
auto &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
675-
auto &LAA = getAnalysis<LoopAccessLegacyAnalysis>();
676+
auto &LAIs = getAnalysis<LoopAccessLegacyAnalysis>().getLAIs();
676677
auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
677678
auto *PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();
678679
auto *BFI = (PSI && PSI->hasProfileSummary()) ?
@@ -681,9 +682,8 @@ class LoopLoadElimination : public FunctionPass {
681682
auto *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
682683

683684
// Process each loop nest in the function.
684-
return eliminateLoadsAcrossLoops(
685-
F, LI, DT, BFI, PSI, SE, /*AC*/ nullptr,
686-
[&LAA](Loop &L) -> const LoopAccessInfo & { return LAA.getInfo(&L); });
685+
return eliminateLoadsAcrossLoops(F, LI, DT, BFI, PSI, SE, /*AC*/ nullptr,
686+
LAIs);
687687
}
688688

689689
void getAnalysisUsage(AnalysisUsage &AU) const override {
@@ -736,9 +736,7 @@ PreservedAnalyses LoopLoadEliminationPass::run(Function &F,
736736
&AM.getResult<BlockFrequencyAnalysis>(F) : nullptr;
737737
LoopAccessInfoManager &LAIs = AM.getResult<LoopAccessAnalysis>(F);
738738

739-
bool Changed = eliminateLoadsAcrossLoops(
740-
F, LI, DT, BFI, PSI, &SE, &AC,
741-
[&](Loop &L) -> const LoopAccessInfo & { return LAIs.getInfo(L); });
739+
bool Changed = eliminateLoadsAcrossLoops(F, LI, DT, BFI, PSI, &SE, &AC, LAIs);
742740

743741
if (!Changed)
744742
return PreservedAnalyses::all();

llvm/lib/Transforms/Scalar/LoopVersioningLICM.cpp

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,8 @@ struct LoopVersioningLICM {
147147
// LoopAccessInfo will take place only when it's necessary.
148148
LoopVersioningLICM(AliasAnalysis *AA, ScalarEvolution *SE,
149149
OptimizationRemarkEmitter *ORE,
150-
function_ref<const LoopAccessInfo &(Loop *)> GetLAI)
151-
: AA(AA), SE(SE), GetLAI(GetLAI),
152-
LoopDepthThreshold(LVLoopDepthThreshold),
150+
LoopAccessInfoManager &LAIs)
151+
: AA(AA), SE(SE), LAIs(LAIs), LoopDepthThreshold(LVLoopDepthThreshold),
153152
InvariantThreshold(LVInvarThreshold), ORE(ORE) {}
154153

155154
bool runOnLoop(Loop *L, LoopInfo *LI, DominatorTree *DT);
@@ -185,7 +184,7 @@ struct LoopVersioningLICM {
185184
const LoopAccessInfo *LAI = nullptr;
186185

187186
// Proxy for retrieving LoopAccessInfo.
188-
function_ref<const LoopAccessInfo &(Loop *)> GetLAI;
187+
LoopAccessInfoManager &LAIs;
189188

190189
// The current loop we are working on.
191190
Loop *CurLoop = nullptr;
@@ -413,7 +412,7 @@ bool LoopVersioningLICM::legalLoopInstructions() {
413412
}
414413
}
415414
// Get LoopAccessInfo from current loop via the proxy.
416-
LAI = &GetLAI(CurLoop);
415+
LAI = &LAIs.getInfo(*CurLoop);
417416
// Check LoopAccessInfo for need of runtime check.
418417
if (LAI->getRuntimePointerChecking()->getChecks().empty()) {
419418
LLVM_DEBUG(dbgs() << " LAA: Runtime check not found !!\n");
@@ -584,12 +583,9 @@ bool LoopVersioningLICMLegacyPass::runOnLoop(Loop *L, LPPassManager &LPM) {
584583
&getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE();
585584
LoopInfo *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
586585
DominatorTree *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
586+
auto &LAIs = getAnalysis<LoopAccessLegacyAnalysis>().getLAIs();
587587

588-
auto GetLAI = [&](Loop *L) -> const LoopAccessInfo & {
589-
return getAnalysis<LoopAccessLegacyAnalysis>().getInfo(L);
590-
};
591-
592-
return LoopVersioningLICM(AA, SE, ORE, GetLAI).runOnLoop(L, LI, DT);
588+
return LoopVersioningLICM(AA, SE, ORE, LAIs).runOnLoop(L, LI, DT);
593589
}
594590

595591
bool LoopVersioningLICM::runOnLoop(Loop *L, LoopInfo *LI, DominatorTree *DT) {
@@ -672,9 +668,7 @@ PreservedAnalyses LoopVersioningLICMPass::run(Loop &L, LoopAnalysisManager &AM,
672668
OptimizationRemarkEmitter ORE(F);
673669

674670
LoopAccessInfoManager LAIs(*SE, *AA, *DT, *LI, nullptr);
675-
std::function<const LoopAccessInfo &(Loop *)> GetLAI =
676-
[&](Loop *L) -> const LoopAccessInfo & { return LAIs.getInfo(*L); };
677-
if (!LoopVersioningLICM(AA, SE, &ORE, GetLAI).runOnLoop(&L, LI, DT))
671+
if (!LoopVersioningLICM(AA, SE, &ORE, LAIs).runOnLoop(&L, LI, DT))
678672
return PreservedAnalyses::all();
679673
return getLoopPassPreservedAnalyses();
680674
}

llvm/lib/Transforms/Utils/LoopVersioning.cpp

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -256,8 +256,8 @@ void LoopVersioning::annotateInstWithNoAlias(Instruction *VersionedInst,
256256
}
257257

258258
namespace {
259-
bool runImpl(LoopInfo *LI, function_ref<const LoopAccessInfo &(Loop &)> GetLAA,
260-
DominatorTree *DT, ScalarEvolution *SE) {
259+
bool runImpl(LoopInfo *LI, LoopAccessInfoManager &LAIs, DominatorTree *DT,
260+
ScalarEvolution *SE) {
261261
// Build up a worklist of inner-loops to version. This is necessary as the
262262
// act of versioning a loop creates new loops and can invalidate iterators
263263
// across the loops.
@@ -275,7 +275,7 @@ bool runImpl(LoopInfo *LI, function_ref<const LoopAccessInfo &(Loop &)> GetLAA,
275275
if (!L->isLoopSimplifyForm() || !L->isRotatedForm() ||
276276
!L->getExitingBlock())
277277
continue;
278-
const LoopAccessInfo &LAI = GetLAA(*L);
278+
const LoopAccessInfo &LAI = LAIs.getInfo(*L);
279279
if (!LAI.hasConvergentOp() &&
280280
(LAI.getNumRuntimePointerChecks() ||
281281
!LAI.getPSE().getPredicate().isAlwaysTrue())) {
@@ -301,14 +301,11 @@ class LoopVersioningLegacyPass : public FunctionPass {
301301

302302
bool runOnFunction(Function &F) override {
303303
auto *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
304-
auto GetLAA = [&](Loop &L) -> const LoopAccessInfo & {
305-
return getAnalysis<LoopAccessLegacyAnalysis>().getInfo(&L);
306-
};
307-
304+
auto &LAIs = getAnalysis<LoopAccessLegacyAnalysis>().getLAIs();
308305
auto *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
309306
auto *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
310307

311-
return runImpl(LI, GetLAA, DT, SE);
308+
return runImpl(LI, LAIs, DT, SE);
312309
}
313310

314311
void getAnalysisUsage(AnalysisUsage &AU) const override {
@@ -348,14 +345,10 @@ PreservedAnalyses LoopVersioningPass::run(Function &F,
348345
FunctionAnalysisManager &AM) {
349346
auto &SE = AM.getResult<ScalarEvolutionAnalysis>(F);
350347
auto &LI = AM.getResult<LoopAnalysis>(F);
351-
auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
352-
353348
LoopAccessInfoManager &LAIs = AM.getResult<LoopAccessAnalysis>(F);
354-
auto GetLAA = [&](Loop &L) -> const LoopAccessInfo & {
355-
return LAIs.getInfo(L);
356-
};
349+
auto &DT = AM.getResult<DominatorTreeAnalysis>(F);
357350

358-
if (runImpl(&LI, GetLAA, &DT, &SE))
351+
if (runImpl(&LI, LAIs, &DT, &SE))
359352
return PreservedAnalyses::none();
360353
return PreservedAnalyses::all();
361354
}

llvm/lib/Transforms/Vectorize/LoopVectorizationLegality.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -916,7 +916,7 @@ bool LoopVectorizationLegality::canVectorizeInstrs() {
916916
}
917917

918918
bool LoopVectorizationLegality::canVectorizeMemory() {
919-
LAI = &(*GetLAA)(*TheLoop);
919+
LAI = &LAIs.getInfo(*TheLoop);
920920
const OptimizationRemarkAnalysis *LAR = LAI->getReport();
921921
if (LAR) {
922922
ORE->emit([&]() {

0 commit comments

Comments
 (0)