69
69
#include " llvm/Analysis/LoopAnalysisManager.h"
70
70
#include " llvm/Analysis/LoopInfo.h"
71
71
#include " llvm/Analysis/LoopPass.h"
72
+ #include " llvm/Analysis/MemorySSA.h"
73
+ #include " llvm/Analysis/MemorySSAUpdater.h"
72
74
#include " llvm/Analysis/ScalarEvolution.h"
73
75
#include " llvm/Analysis/ScalarEvolutionExpander.h"
74
76
#include " llvm/Analysis/ScalarEvolutionExpressions.h"
@@ -1886,9 +1888,10 @@ class LSRInstance {
1886
1888
DominatorTree &DT;
1887
1889
LoopInfo &LI;
1888
1890
AssumptionCache ∾
1889
- TargetLibraryInfo &LibInfo ;
1891
+ TargetLibraryInfo &TLI ;
1890
1892
const TargetTransformInfo &TTI;
1891
1893
Loop *const L;
1894
+ MemorySSAUpdater *MSSAU;
1892
1895
bool FavorBackedgeIndex = false ;
1893
1896
bool Changed = false ;
1894
1897
@@ -2026,7 +2029,7 @@ class LSRInstance {
2026
2029
public:
2027
2030
LSRInstance (Loop *L, IVUsers &IU, ScalarEvolution &SE, DominatorTree &DT,
2028
2031
LoopInfo &LI, const TargetTransformInfo &TTI, AssumptionCache &AC,
2029
- TargetLibraryInfo &LibInfo );
2032
+ TargetLibraryInfo &TLI, MemorySSAUpdater *MSSAU );
2030
2033
2031
2034
bool getChanged () const { return Changed; }
2032
2035
@@ -3214,7 +3217,7 @@ void LSRInstance::GenerateIVChain(const IVChain &Chain, SCEVExpander &Rewriter,
3214
3217
3215
3218
void LSRInstance::CollectFixupsAndInitialFormulae () {
3216
3219
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 );
3218
3221
3219
3222
for (const IVStrideUse &U : IU) {
3220
3223
Instruction *UserInst = U.getUser ();
@@ -5466,16 +5469,17 @@ void LSRInstance::ImplementSolution(
5466
5469
// instructions.
5467
5470
Rewriter.clear ();
5468
5471
5469
- Changed |= RecursivelyDeleteTriviallyDeadInstructionsPermissive (DeadInsts);
5472
+ Changed |= RecursivelyDeleteTriviallyDeadInstructionsPermissive (DeadInsts,
5473
+ &TLI, MSSAU);
5470
5474
}
5471
5475
5472
5476
LSRInstance::LSRInstance (Loop *L, IVUsers &IU, ScalarEvolution &SE,
5473
5477
DominatorTree &DT, LoopInfo &LI,
5474
5478
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)) {
5479
5483
// If LoopSimplify form is not available, stay out of trouble.
5480
5484
if (!L->isLoopSimplifyForm ())
5481
5485
return ;
@@ -5678,21 +5682,26 @@ void LoopStrengthReduce::getAnalysisUsage(AnalysisUsage &AU) const {
5678
5682
AU.addRequired <IVUsersWrapperPass>();
5679
5683
AU.addPreserved <IVUsersWrapperPass>();
5680
5684
AU.addRequired <TargetTransformInfoWrapperPass>();
5685
+ AU.addPreserved <MemorySSAWrapperPass>();
5681
5686
}
5682
5687
5683
5688
static bool ReduceLoopStrength (Loop *L, IVUsers &IU, ScalarEvolution &SE,
5684
5689
DominatorTree &DT, LoopInfo &LI,
5685
5690
const TargetTransformInfo &TTI,
5686
- AssumptionCache &AC,
5687
- TargetLibraryInfo &LibInfo ) {
5691
+ AssumptionCache &AC, TargetLibraryInfo &TLI,
5692
+ MemorySSA *MSSA ) {
5688
5693
5689
5694
bool Changed = false ;
5695
+ std::unique_ptr<MemorySSAUpdater> MSSAU;
5696
+ if (MSSA)
5697
+ MSSAU = std::make_unique<MemorySSAUpdater>(MSSA);
5690
5698
5691
5699
// 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 ();
5693
5702
5694
5703
// Remove any extra phis created by processing inner loops.
5695
- Changed |= DeleteDeadPHIs (L->getHeader ());
5704
+ Changed |= DeleteDeadPHIs (L->getHeader (), &TLI, MSSAU. get () );
5696
5705
if (EnablePhiElim && L->isLoopSimplifyForm ()) {
5697
5706
SmallVector<WeakTrackingVH, 16 > DeadInsts;
5698
5707
const DataLayout &DL = L->getHeader ()->getModule ()->getDataLayout ();
@@ -5703,8 +5712,9 @@ static bool ReduceLoopStrength(Loop *L, IVUsers &IU, ScalarEvolution &SE,
5703
5712
unsigned numFolded = Rewriter.replaceCongruentIVs (L, &DT, DeadInsts, &TTI);
5704
5713
if (numFolded) {
5705
5714
Changed = true ;
5706
- RecursivelyDeleteTriviallyDeadInstructionsPermissive (DeadInsts);
5707
- DeleteDeadPHIs (L->getHeader ());
5715
+ RecursivelyDeleteTriviallyDeadInstructionsPermissive (DeadInsts, &TLI,
5716
+ MSSAU.get ());
5717
+ DeleteDeadPHIs (L->getHeader (), &TLI, MSSAU.get ());
5708
5718
}
5709
5719
}
5710
5720
return Changed;
@@ -5722,19 +5732,26 @@ bool LoopStrengthReduce::runOnLoop(Loop *L, LPPassManager & /*LPM*/) {
5722
5732
*L->getHeader ()->getParent ());
5723
5733
auto &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache (
5724
5734
*L->getHeader ()->getParent ());
5725
- auto &LibInfo = getAnalysis<TargetLibraryInfoWrapperPass>().getTLI (
5735
+ auto &TLI = getAnalysis<TargetLibraryInfoWrapperPass>().getTLI (
5726
5736
*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);
5728
5742
}
5729
5743
5730
5744
PreservedAnalyses LoopStrengthReducePass::run (Loop &L, LoopAnalysisManager &AM,
5731
5745
LoopStandardAnalysisResults &AR,
5732
5746
LPMUpdater &) {
5733
5747
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 ))
5735
5749
return PreservedAnalyses::all ();
5736
5750
5737
- return getLoopPassPreservedAnalyses ();
5751
+ auto PA = getLoopPassPreservedAnalyses ();
5752
+ if (AR.MSSA )
5753
+ PA.preserve <MemorySSAAnalysis>();
5754
+ return PA;
5738
5755
}
5739
5756
5740
5757
char LoopStrengthReduce::ID = 0 ;
0 commit comments