Skip to content

Commit 0d90d24

Browse files
committed
[LoopStrengthReduce] Teach LoopStrengthReduce to preserve MemorySSA is available.
1 parent a33accd commit 0d90d24

File tree

1 file changed

+35
-18
lines changed

1 file changed

+35
-18
lines changed

llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@
6969
#include "llvm/Analysis/LoopAnalysisManager.h"
7070
#include "llvm/Analysis/LoopInfo.h"
7171
#include "llvm/Analysis/LoopPass.h"
72+
#include "llvm/Analysis/MemorySSA.h"
73+
#include "llvm/Analysis/MemorySSAUpdater.h"
7274
#include "llvm/Analysis/ScalarEvolution.h"
7375
#include "llvm/Analysis/ScalarEvolutionExpander.h"
7476
#include "llvm/Analysis/ScalarEvolutionExpressions.h"
@@ -1886,9 +1888,10 @@ class LSRInstance {
18861888
DominatorTree &DT;
18871889
LoopInfo &LI;
18881890
AssumptionCache ∾
1889-
TargetLibraryInfo &LibInfo;
1891+
TargetLibraryInfo &TLI;
18901892
const TargetTransformInfo &TTI;
18911893
Loop *const L;
1894+
MemorySSAUpdater *MSSAU;
18921895
bool FavorBackedgeIndex = false;
18931896
bool Changed = false;
18941897

@@ -2026,7 +2029,7 @@ class LSRInstance {
20262029
public:
20272030
LSRInstance(Loop *L, IVUsers &IU, ScalarEvolution &SE, DominatorTree &DT,
20282031
LoopInfo &LI, const TargetTransformInfo &TTI, AssumptionCache &AC,
2029-
TargetLibraryInfo &LibInfo);
2032+
TargetLibraryInfo &TLI, MemorySSAUpdater *MSSAU);
20302033

20312034
bool getChanged() const { return Changed; }
20322035

@@ -3214,7 +3217,7 @@ void LSRInstance::GenerateIVChain(const IVChain &Chain, SCEVExpander &Rewriter,
32143217

32153218
void LSRInstance::CollectFixupsAndInitialFormulae() {
32163219
BranchInst *ExitBranch = nullptr;
3217-
bool SaveCmp = TTI.canSaveCmp(L, &ExitBranch, &SE, &LI, &DT, &AC, &LibInfo);
3220+
bool SaveCmp = TTI.canSaveCmp(L, &ExitBranch, &SE, &LI, &DT, &AC, &TLI);
32183221

32193222
for (const IVStrideUse &U : IU) {
32203223
Instruction *UserInst = U.getUser();
@@ -5466,16 +5469,17 @@ void LSRInstance::ImplementSolution(
54665469
// instructions.
54675470
Rewriter.clear();
54685471

5469-
Changed |= RecursivelyDeleteTriviallyDeadInstructionsPermissive(DeadInsts);
5472+
Changed |= RecursivelyDeleteTriviallyDeadInstructionsPermissive(DeadInsts,
5473+
&TLI, MSSAU);
54705474
}
54715475

54725476
LSRInstance::LSRInstance(Loop *L, IVUsers &IU, ScalarEvolution &SE,
54735477
DominatorTree &DT, LoopInfo &LI,
54745478
const TargetTransformInfo &TTI, AssumptionCache &AC,
5475-
TargetLibraryInfo &LibInfo)
5476-
: IU(IU), SE(SE), DT(DT), LI(LI), AC(AC), LibInfo(LibInfo), TTI(TTI), L(L),
5477-
FavorBackedgeIndex(EnableBackedgeIndexing &&
5478-
TTI.shouldFavorBackedgeIndex(L)) {
5479+
TargetLibraryInfo &TLI, MemorySSAUpdater *MSSAU)
5480+
: IU(IU), SE(SE), DT(DT), LI(LI), AC(AC), TLI(TLI), TTI(TTI), L(L),
5481+
MSSAU(MSSAU), FavorBackedgeIndex(EnableBackedgeIndexing &&
5482+
TTI.shouldFavorBackedgeIndex(L)) {
54795483
// If LoopSimplify form is not available, stay out of trouble.
54805484
if (!L->isLoopSimplifyForm())
54815485
return;
@@ -5678,21 +5682,26 @@ void LoopStrengthReduce::getAnalysisUsage(AnalysisUsage &AU) const {
56785682
AU.addRequired<IVUsersWrapperPass>();
56795683
AU.addPreserved<IVUsersWrapperPass>();
56805684
AU.addRequired<TargetTransformInfoWrapperPass>();
5685+
AU.addPreserved<MemorySSAWrapperPass>();
56815686
}
56825687

56835688
static bool ReduceLoopStrength(Loop *L, IVUsers &IU, ScalarEvolution &SE,
56845689
DominatorTree &DT, LoopInfo &LI,
56855690
const TargetTransformInfo &TTI,
5686-
AssumptionCache &AC,
5687-
TargetLibraryInfo &LibInfo) {
5691+
AssumptionCache &AC, TargetLibraryInfo &TLI,
5692+
MemorySSA *MSSA) {
56885693

56895694
bool Changed = false;
5695+
std::unique_ptr<MemorySSAUpdater> MSSAU;
5696+
if (MSSA)
5697+
MSSAU = std::make_unique<MemorySSAUpdater>(MSSA);
56905698

56915699
// Run the main LSR transformation.
5692-
Changed |= LSRInstance(L, IU, SE, DT, LI, TTI, AC, LibInfo).getChanged();
5700+
Changed |=
5701+
LSRInstance(L, IU, SE, DT, LI, TTI, AC, TLI, MSSAU.get()).getChanged();
56935702

56945703
// Remove any extra phis created by processing inner loops.
5695-
Changed |= DeleteDeadPHIs(L->getHeader());
5704+
Changed |= DeleteDeadPHIs(L->getHeader(), &TLI, MSSAU.get());
56965705
if (EnablePhiElim && L->isLoopSimplifyForm()) {
56975706
SmallVector<WeakTrackingVH, 16> DeadInsts;
56985707
const DataLayout &DL = L->getHeader()->getModule()->getDataLayout();
@@ -5703,8 +5712,9 @@ static bool ReduceLoopStrength(Loop *L, IVUsers &IU, ScalarEvolution &SE,
57035712
unsigned numFolded = Rewriter.replaceCongruentIVs(L, &DT, DeadInsts, &TTI);
57045713
if (numFolded) {
57055714
Changed = true;
5706-
RecursivelyDeleteTriviallyDeadInstructionsPermissive(DeadInsts);
5707-
DeleteDeadPHIs(L->getHeader());
5715+
RecursivelyDeleteTriviallyDeadInstructionsPermissive(DeadInsts, &TLI,
5716+
MSSAU.get());
5717+
DeleteDeadPHIs(L->getHeader(), &TLI, MSSAU.get());
57085718
}
57095719
}
57105720
return Changed;
@@ -5722,19 +5732,26 @@ bool LoopStrengthReduce::runOnLoop(Loop *L, LPPassManager & /*LPM*/) {
57225732
*L->getHeader()->getParent());
57235733
auto &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(
57245734
*L->getHeader()->getParent());
5725-
auto &LibInfo = getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(
5735+
auto &TLI = getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(
57265736
*L->getHeader()->getParent());
5727-
return ReduceLoopStrength(L, IU, SE, DT, LI, TTI, AC, LibInfo);
5737+
auto *MSSAAnalysis = getAnalysisIfAvailable<MemorySSAWrapperPass>();
5738+
MemorySSA *MSSA = nullptr;
5739+
if (MSSAAnalysis)
5740+
MSSA = &MSSAAnalysis->getMSSA();
5741+
return ReduceLoopStrength(L, IU, SE, DT, LI, TTI, AC, TLI, MSSA);
57285742
}
57295743

57305744
PreservedAnalyses LoopStrengthReducePass::run(Loop &L, LoopAnalysisManager &AM,
57315745
LoopStandardAnalysisResults &AR,
57325746
LPMUpdater &) {
57335747
if (!ReduceLoopStrength(&L, AM.getResult<IVUsersAnalysis>(L, AR), AR.SE,
5734-
AR.DT, AR.LI, AR.TTI, AR.AC, AR.TLI))
5748+
AR.DT, AR.LI, AR.TTI, AR.AC, AR.TLI, AR.MSSA))
57355749
return PreservedAnalyses::all();
57365750

5737-
return getLoopPassPreservedAnalyses();
5751+
auto PA = getLoopPassPreservedAnalyses();
5752+
if (AR.MSSA)
5753+
PA.preserve<MemorySSAAnalysis>();
5754+
return PA;
57385755
}
57395756

57405757
char LoopStrengthReduce::ID = 0;

0 commit comments

Comments
 (0)