forked from OSchip/llvm-project
[IndVarSimplify] Teach IndVarSimplify to preserve MemorySSA.
This commit is contained in:
parent
c4144caf9b
commit
adc4faf532
|
@ -38,6 +38,8 @@
|
|||
#include "llvm/ADT/iterator_range.h"
|
||||
#include "llvm/Analysis/LoopInfo.h"
|
||||
#include "llvm/Analysis/LoopPass.h"
|
||||
#include "llvm/Analysis/MemorySSA.h"
|
||||
#include "llvm/Analysis/MemorySSAUpdater.h"
|
||||
#include "llvm/Analysis/ScalarEvolution.h"
|
||||
#include "llvm/Analysis/ScalarEvolutionExpander.h"
|
||||
#include "llvm/Analysis/ScalarEvolutionExpressions.h"
|
||||
|
@ -138,6 +140,8 @@ class IndVarSimplify {
|
|||
const DataLayout &DL;
|
||||
TargetLibraryInfo *TLI;
|
||||
const TargetTransformInfo *TTI;
|
||||
MemorySSA *MSSA;
|
||||
std::unique_ptr<MemorySSAUpdater> MSSAU;
|
||||
|
||||
SmallVector<WeakTrackingVH, 16> DeadInsts;
|
||||
|
||||
|
@ -162,8 +166,11 @@ class IndVarSimplify {
|
|||
public:
|
||||
IndVarSimplify(LoopInfo *LI, ScalarEvolution *SE, DominatorTree *DT,
|
||||
const DataLayout &DL, TargetLibraryInfo *TLI,
|
||||
TargetTransformInfo *TTI)
|
||||
: LI(LI), SE(SE), DT(DT), DL(DL), TLI(TLI), TTI(TTI) {}
|
||||
TargetTransformInfo *TTI, MemorySSA *MSSA)
|
||||
: LI(LI), SE(SE), DT(DT), DL(DL), TLI(TLI), TTI(TTI), MSSA(MSSA) {
|
||||
if (MSSA)
|
||||
MSSAU = std::make_unique<MemorySSAUpdater>(MSSA);
|
||||
}
|
||||
|
||||
bool run(Loop *L);
|
||||
};
|
||||
|
@ -418,11 +425,11 @@ bool IndVarSimplify::handleFloatingPointIV(Loop *L, PHINode *PN) {
|
|||
// new comparison.
|
||||
NewCompare->takeName(Compare);
|
||||
Compare->replaceAllUsesWith(NewCompare);
|
||||
RecursivelyDeleteTriviallyDeadInstructions(Compare, TLI);
|
||||
RecursivelyDeleteTriviallyDeadInstructions(Compare, TLI, MSSAU.get());
|
||||
|
||||
// Delete the old floating point increment.
|
||||
Incr->replaceAllUsesWith(UndefValue::get(Incr->getType()));
|
||||
RecursivelyDeleteTriviallyDeadInstructions(Incr, TLI);
|
||||
RecursivelyDeleteTriviallyDeadInstructions(Incr, TLI, MSSAU.get());
|
||||
|
||||
// If the FP induction variable still has uses, this is because something else
|
||||
// in the loop uses its value. In order to canonicalize the induction
|
||||
|
@ -435,7 +442,7 @@ bool IndVarSimplify::handleFloatingPointIV(Loop *L, PHINode *PN) {
|
|||
Value *Conv = new SIToFPInst(NewPHI, PN->getType(), "indvar.conv",
|
||||
&*PN->getParent()->getFirstInsertionPt());
|
||||
PN->replaceAllUsesWith(Conv);
|
||||
RecursivelyDeleteTriviallyDeadInstructions(PN, TLI);
|
||||
RecursivelyDeleteTriviallyDeadInstructions(PN, TLI, MSSAU.get());
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
@ -2823,12 +2830,14 @@ PreservedAnalyses IndVarSimplifyPass::run(Loop &L, LoopAnalysisManager &AM,
|
|||
Function *F = L.getHeader()->getParent();
|
||||
const DataLayout &DL = F->getParent()->getDataLayout();
|
||||
|
||||
IndVarSimplify IVS(&AR.LI, &AR.SE, &AR.DT, DL, &AR.TLI, &AR.TTI);
|
||||
IndVarSimplify IVS(&AR.LI, &AR.SE, &AR.DT, DL, &AR.TLI, &AR.TTI, AR.MSSA);
|
||||
if (!IVS.run(&L))
|
||||
return PreservedAnalyses::all();
|
||||
|
||||
auto PA = getLoopPassPreservedAnalyses();
|
||||
PA.preserveSet<CFGAnalyses>();
|
||||
if (AR.MSSA)
|
||||
PA.preserve<MemorySSAAnalysis>();
|
||||
return PA;
|
||||
}
|
||||
|
||||
|
@ -2853,13 +2862,18 @@ struct IndVarSimplifyLegacyPass : public LoopPass {
|
|||
auto *TTIP = getAnalysisIfAvailable<TargetTransformInfoWrapperPass>();
|
||||
auto *TTI = TTIP ? &TTIP->getTTI(*L->getHeader()->getParent()) : nullptr;
|
||||
const DataLayout &DL = L->getHeader()->getModule()->getDataLayout();
|
||||
auto *MSSAAnalysis = getAnalysisIfAvailable<MemorySSAWrapperPass>();
|
||||
MemorySSA *MSSA = nullptr;
|
||||
if (MSSAAnalysis)
|
||||
MSSA = &MSSAAnalysis->getMSSA();
|
||||
|
||||
IndVarSimplify IVS(LI, SE, DT, DL, TLI, TTI);
|
||||
IndVarSimplify IVS(LI, SE, DT, DL, TLI, TTI, MSSA);
|
||||
return IVS.run(L);
|
||||
}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.setPreservesCFG();
|
||||
AU.addPreserved<MemorySSAWrapperPass>();
|
||||
getLoopAnalysisUsage(AU);
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue