mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-04-02 07:41:38 +00:00
[LoopStrengthReduce] Teach LoopStrengthReduce to preserve MemorySSA is available.
This commit is contained in:
parent
60e190fa7c
commit
09de66f657
@ -69,6 +69,8 @@
|
|||||||
#include "llvm/Analysis/LoopAnalysisManager.h"
|
#include "llvm/Analysis/LoopAnalysisManager.h"
|
||||||
#include "llvm/Analysis/LoopInfo.h"
|
#include "llvm/Analysis/LoopInfo.h"
|
||||||
#include "llvm/Analysis/LoopPass.h"
|
#include "llvm/Analysis/LoopPass.h"
|
||||||
|
#include "llvm/Analysis/MemorySSA.h"
|
||||||
|
#include "llvm/Analysis/MemorySSAUpdater.h"
|
||||||
#include "llvm/Analysis/ScalarEvolution.h"
|
#include "llvm/Analysis/ScalarEvolution.h"
|
||||||
#include "llvm/Analysis/ScalarEvolutionExpander.h"
|
#include "llvm/Analysis/ScalarEvolutionExpander.h"
|
||||||
#include "llvm/Analysis/ScalarEvolutionExpressions.h"
|
#include "llvm/Analysis/ScalarEvolutionExpressions.h"
|
||||||
@ -1886,9 +1888,10 @@ class LSRInstance {
|
|||||||
DominatorTree &DT;
|
DominatorTree &DT;
|
||||||
LoopInfo &LI;
|
LoopInfo &LI;
|
||||||
AssumptionCache ∾
|
AssumptionCache ∾
|
||||||
TargetLibraryInfo &LibInfo;
|
TargetLibraryInfo &TLI;
|
||||||
const TargetTransformInfo &TTI;
|
const TargetTransformInfo &TTI;
|
||||||
Loop *const L;
|
Loop *const L;
|
||||||
|
MemorySSAUpdater *MSSAU;
|
||||||
bool FavorBackedgeIndex = false;
|
bool FavorBackedgeIndex = false;
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
|
|
||||||
@ -2026,7 +2029,7 @@ class LSRInstance {
|
|||||||
public:
|
public:
|
||||||
LSRInstance(Loop *L, IVUsers &IU, ScalarEvolution &SE, DominatorTree &DT,
|
LSRInstance(Loop *L, IVUsers &IU, ScalarEvolution &SE, DominatorTree &DT,
|
||||||
LoopInfo &LI, const TargetTransformInfo &TTI, AssumptionCache &AC,
|
LoopInfo &LI, const TargetTransformInfo &TTI, AssumptionCache &AC,
|
||||||
TargetLibraryInfo &LibInfo);
|
TargetLibraryInfo &TLI, MemorySSAUpdater *MSSAU);
|
||||||
|
|
||||||
bool getChanged() const { return Changed; }
|
bool getChanged() const { return Changed; }
|
||||||
|
|
||||||
@ -3214,7 +3217,7 @@ void LSRInstance::GenerateIVChain(const IVChain &Chain, SCEVExpander &Rewriter,
|
|||||||
|
|
||||||
void LSRInstance::CollectFixupsAndInitialFormulae() {
|
void LSRInstance::CollectFixupsAndInitialFormulae() {
|
||||||
BranchInst *ExitBranch = nullptr;
|
BranchInst *ExitBranch = nullptr;
|
||||||
bool SaveCmp = TTI.canSaveCmp(L, &ExitBranch, &SE, &LI, &DT, &AC, &LibInfo);
|
bool SaveCmp = TTI.canSaveCmp(L, &ExitBranch, &SE, &LI, &DT, &AC, &TLI);
|
||||||
|
|
||||||
for (const IVStrideUse &U : IU) {
|
for (const IVStrideUse &U : IU) {
|
||||||
Instruction *UserInst = U.getUser();
|
Instruction *UserInst = U.getUser();
|
||||||
@ -5466,16 +5469,17 @@ void LSRInstance::ImplementSolution(
|
|||||||
// instructions.
|
// instructions.
|
||||||
Rewriter.clear();
|
Rewriter.clear();
|
||||||
|
|
||||||
Changed |= RecursivelyDeleteTriviallyDeadInstructionsPermissive(DeadInsts);
|
Changed |= RecursivelyDeleteTriviallyDeadInstructionsPermissive(DeadInsts,
|
||||||
|
&TLI, MSSAU);
|
||||||
}
|
}
|
||||||
|
|
||||||
LSRInstance::LSRInstance(Loop *L, IVUsers &IU, ScalarEvolution &SE,
|
LSRInstance::LSRInstance(Loop *L, IVUsers &IU, ScalarEvolution &SE,
|
||||||
DominatorTree &DT, LoopInfo &LI,
|
DominatorTree &DT, LoopInfo &LI,
|
||||||
const TargetTransformInfo &TTI, AssumptionCache &AC,
|
const TargetTransformInfo &TTI, AssumptionCache &AC,
|
||||||
TargetLibraryInfo &LibInfo)
|
TargetLibraryInfo &TLI, MemorySSAUpdater *MSSAU)
|
||||||
: IU(IU), SE(SE), DT(DT), LI(LI), AC(AC), LibInfo(LibInfo), TTI(TTI), L(L),
|
: IU(IU), SE(SE), DT(DT), LI(LI), AC(AC), TLI(TLI), TTI(TTI), L(L),
|
||||||
FavorBackedgeIndex(EnableBackedgeIndexing &&
|
MSSAU(MSSAU), FavorBackedgeIndex(EnableBackedgeIndexing &&
|
||||||
TTI.shouldFavorBackedgeIndex(L)) {
|
TTI.shouldFavorBackedgeIndex(L)) {
|
||||||
// If LoopSimplify form is not available, stay out of trouble.
|
// If LoopSimplify form is not available, stay out of trouble.
|
||||||
if (!L->isLoopSimplifyForm())
|
if (!L->isLoopSimplifyForm())
|
||||||
return;
|
return;
|
||||||
@ -5678,21 +5682,26 @@ void LoopStrengthReduce::getAnalysisUsage(AnalysisUsage &AU) const {
|
|||||||
AU.addRequired<IVUsersWrapperPass>();
|
AU.addRequired<IVUsersWrapperPass>();
|
||||||
AU.addPreserved<IVUsersWrapperPass>();
|
AU.addPreserved<IVUsersWrapperPass>();
|
||||||
AU.addRequired<TargetTransformInfoWrapperPass>();
|
AU.addRequired<TargetTransformInfoWrapperPass>();
|
||||||
|
AU.addPreserved<MemorySSAWrapperPass>();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ReduceLoopStrength(Loop *L, IVUsers &IU, ScalarEvolution &SE,
|
static bool ReduceLoopStrength(Loop *L, IVUsers &IU, ScalarEvolution &SE,
|
||||||
DominatorTree &DT, LoopInfo &LI,
|
DominatorTree &DT, LoopInfo &LI,
|
||||||
const TargetTransformInfo &TTI,
|
const TargetTransformInfo &TTI,
|
||||||
AssumptionCache &AC,
|
AssumptionCache &AC, TargetLibraryInfo &TLI,
|
||||||
TargetLibraryInfo &LibInfo) {
|
MemorySSA *MSSA) {
|
||||||
|
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
|
std::unique_ptr<MemorySSAUpdater> MSSAU;
|
||||||
|
if (MSSA)
|
||||||
|
MSSAU = std::make_unique<MemorySSAUpdater>(MSSA);
|
||||||
|
|
||||||
// Run the main LSR transformation.
|
// Run the main LSR transformation.
|
||||||
Changed |= LSRInstance(L, IU, SE, DT, LI, TTI, AC, LibInfo).getChanged();
|
Changed |=
|
||||||
|
LSRInstance(L, IU, SE, DT, LI, TTI, AC, TLI, MSSAU.get()).getChanged();
|
||||||
|
|
||||||
// Remove any extra phis created by processing inner loops.
|
// Remove any extra phis created by processing inner loops.
|
||||||
Changed |= DeleteDeadPHIs(L->getHeader());
|
Changed |= DeleteDeadPHIs(L->getHeader(), &TLI, MSSAU.get());
|
||||||
if (EnablePhiElim && L->isLoopSimplifyForm()) {
|
if (EnablePhiElim && L->isLoopSimplifyForm()) {
|
||||||
SmallVector<WeakTrackingVH, 16> DeadInsts;
|
SmallVector<WeakTrackingVH, 16> DeadInsts;
|
||||||
const DataLayout &DL = L->getHeader()->getModule()->getDataLayout();
|
const DataLayout &DL = L->getHeader()->getModule()->getDataLayout();
|
||||||
@ -5703,8 +5712,9 @@ static bool ReduceLoopStrength(Loop *L, IVUsers &IU, ScalarEvolution &SE,
|
|||||||
unsigned numFolded = Rewriter.replaceCongruentIVs(L, &DT, DeadInsts, &TTI);
|
unsigned numFolded = Rewriter.replaceCongruentIVs(L, &DT, DeadInsts, &TTI);
|
||||||
if (numFolded) {
|
if (numFolded) {
|
||||||
Changed = true;
|
Changed = true;
|
||||||
RecursivelyDeleteTriviallyDeadInstructionsPermissive(DeadInsts);
|
RecursivelyDeleteTriviallyDeadInstructionsPermissive(DeadInsts, &TLI,
|
||||||
DeleteDeadPHIs(L->getHeader());
|
MSSAU.get());
|
||||||
|
DeleteDeadPHIs(L->getHeader(), &TLI, MSSAU.get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Changed;
|
return Changed;
|
||||||
@ -5722,19 +5732,26 @@ bool LoopStrengthReduce::runOnLoop(Loop *L, LPPassManager & /*LPM*/) {
|
|||||||
*L->getHeader()->getParent());
|
*L->getHeader()->getParent());
|
||||||
auto &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(
|
auto &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(
|
||||||
*L->getHeader()->getParent());
|
*L->getHeader()->getParent());
|
||||||
auto &LibInfo = getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(
|
auto &TLI = getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(
|
||||||
*L->getHeader()->getParent());
|
*L->getHeader()->getParent());
|
||||||
return ReduceLoopStrength(L, IU, SE, DT, LI, TTI, AC, LibInfo);
|
auto *MSSAAnalysis = getAnalysisIfAvailable<MemorySSAWrapperPass>();
|
||||||
|
MemorySSA *MSSA = nullptr;
|
||||||
|
if (MSSAAnalysis)
|
||||||
|
MSSA = &MSSAAnalysis->getMSSA();
|
||||||
|
return ReduceLoopStrength(L, IU, SE, DT, LI, TTI, AC, TLI, MSSA);
|
||||||
}
|
}
|
||||||
|
|
||||||
PreservedAnalyses LoopStrengthReducePass::run(Loop &L, LoopAnalysisManager &AM,
|
PreservedAnalyses LoopStrengthReducePass::run(Loop &L, LoopAnalysisManager &AM,
|
||||||
LoopStandardAnalysisResults &AR,
|
LoopStandardAnalysisResults &AR,
|
||||||
LPMUpdater &) {
|
LPMUpdater &) {
|
||||||
if (!ReduceLoopStrength(&L, AM.getResult<IVUsersAnalysis>(L, AR), AR.SE,
|
if (!ReduceLoopStrength(&L, AM.getResult<IVUsersAnalysis>(L, AR), AR.SE,
|
||||||
AR.DT, AR.LI, AR.TTI, AR.AC, AR.TLI))
|
AR.DT, AR.LI, AR.TTI, AR.AC, AR.TLI, AR.MSSA))
|
||||||
return PreservedAnalyses::all();
|
return PreservedAnalyses::all();
|
||||||
|
|
||||||
return getLoopPassPreservedAnalyses();
|
auto PA = getLoopPassPreservedAnalyses();
|
||||||
|
if (AR.MSSA)
|
||||||
|
PA.preserve<MemorySSAAnalysis>();
|
||||||
|
return PA;
|
||||||
}
|
}
|
||||||
|
|
||||||
char LoopStrengthReduce::ID = 0;
|
char LoopStrengthReduce::ID = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user