forked from OSchip/llvm-project
[NFC][LICM] Stop passing around unused BFI
Uses of this were removed in 1a25d0bfbb
.
This commit is contained in:
parent
e3bd67eddf
commit
04f3c20989
|
@ -26,7 +26,6 @@ class AnalysisUsage;
|
|||
class TargetTransformInfo;
|
||||
class AAResults;
|
||||
class BasicBlock;
|
||||
class BlockFrequencyInfo;
|
||||
class ICFLoopSafetyInfo;
|
||||
class IRBuilderBase;
|
||||
class Loop;
|
||||
|
@ -141,24 +140,23 @@ protected:
|
|||
/// reverse depth first order w.r.t the DominatorTree. This allows us to visit
|
||||
/// uses before definitions, allowing us to sink a loop body in one pass without
|
||||
/// iteration. Takes DomTreeNode, AAResults, LoopInfo, DominatorTree,
|
||||
/// BlockFrequencyInfo, TargetLibraryInfo, Loop, AliasSet information for all
|
||||
/// TargetLibraryInfo, Loop, AliasSet information for all
|
||||
/// instructions of the loop and loop safety information as
|
||||
/// arguments. Diagnostics is emitted via \p ORE. It returns changed status.
|
||||
/// \p CurLoop is a loop to do sinking on. \p OutermostLoop is used only when
|
||||
/// this function is called by \p sinkRegionForLoopNest.
|
||||
bool sinkRegion(DomTreeNode *, AAResults *, LoopInfo *, DominatorTree *,
|
||||
BlockFrequencyInfo *, TargetLibraryInfo *,
|
||||
TargetTransformInfo *, Loop *CurLoop, MemorySSAUpdater &,
|
||||
ICFLoopSafetyInfo *, SinkAndHoistLICMFlags &,
|
||||
OptimizationRemarkEmitter *, Loop *OutermostLoop = nullptr);
|
||||
TargetLibraryInfo *, TargetTransformInfo *, Loop *CurLoop,
|
||||
MemorySSAUpdater &, ICFLoopSafetyInfo *,
|
||||
SinkAndHoistLICMFlags &, OptimizationRemarkEmitter *,
|
||||
Loop *OutermostLoop = nullptr);
|
||||
|
||||
/// Call sinkRegion on loops contained within the specified loop
|
||||
/// in order from innermost to outermost.
|
||||
bool sinkRegionForLoopNest(DomTreeNode *, AAResults *, LoopInfo *,
|
||||
DominatorTree *, BlockFrequencyInfo *,
|
||||
TargetLibraryInfo *, TargetTransformInfo *, Loop *,
|
||||
MemorySSAUpdater &, ICFLoopSafetyInfo *,
|
||||
SinkAndHoistLICMFlags &,
|
||||
DominatorTree *, TargetLibraryInfo *,
|
||||
TargetTransformInfo *, Loop *, MemorySSAUpdater &,
|
||||
ICFLoopSafetyInfo *, SinkAndHoistLICMFlags &,
|
||||
OptimizationRemarkEmitter *);
|
||||
|
||||
/// Walk the specified region of the CFG (defined by all blocks
|
||||
|
@ -166,14 +164,14 @@ bool sinkRegionForLoopNest(DomTreeNode *, AAResults *, LoopInfo *,
|
|||
/// first order w.r.t the DominatorTree. This allows us to visit definitions
|
||||
/// before uses, allowing us to hoist a loop body in one pass without iteration.
|
||||
/// Takes DomTreeNode, AAResults, LoopInfo, DominatorTree,
|
||||
/// BlockFrequencyInfo, TargetLibraryInfo, Loop, AliasSet information for all
|
||||
/// TargetLibraryInfo, Loop, AliasSet information for all
|
||||
/// instructions of the loop and loop safety information as arguments.
|
||||
/// Diagnostics is emitted via \p ORE. It returns changed status.
|
||||
/// \p AllowSpeculation is whether values should be hoisted even if they are not
|
||||
/// guaranteed to execute in the loop, but are safe to speculatively execute.
|
||||
bool hoistRegion(DomTreeNode *, AAResults *, LoopInfo *, DominatorTree *,
|
||||
BlockFrequencyInfo *, TargetLibraryInfo *, Loop *,
|
||||
MemorySSAUpdater &, ScalarEvolution *, ICFLoopSafetyInfo *,
|
||||
TargetLibraryInfo *, Loop *, MemorySSAUpdater &,
|
||||
ScalarEvolution *, ICFLoopSafetyInfo *,
|
||||
SinkAndHoistLICMFlags &, OptimizationRemarkEmitter *, bool,
|
||||
bool AllowSpeculation);
|
||||
|
||||
|
|
|
@ -1400,8 +1400,7 @@ Error PassBuilder::parseFunctionPass(FunctionPassManager &FPM,
|
|||
// Add the nested pass manager with the appropriate adaptor.
|
||||
bool UseMemorySSA = (Name == "loop-mssa");
|
||||
bool UseBFI = llvm::any_of(InnerPipeline, [](auto Pipeline) {
|
||||
return Pipeline.Name.contains("licm") ||
|
||||
Pipeline.Name.contains("simple-loop-unswitch");
|
||||
return Pipeline.Name.contains("simple-loop-unswitch");
|
||||
});
|
||||
bool UseBPI = llvm::any_of(InnerPipeline, [](auto Pipeline) {
|
||||
return Pipeline.Name == "loop-predication";
|
||||
|
|
|
@ -147,9 +147,8 @@ static void hoist(Instruction &I, const DominatorTree *DT, const Loop *CurLoop,
|
|||
MemorySSAUpdater &MSSAU, ScalarEvolution *SE,
|
||||
OptimizationRemarkEmitter *ORE);
|
||||
static bool sink(Instruction &I, LoopInfo *LI, DominatorTree *DT,
|
||||
BlockFrequencyInfo *BFI, const Loop *CurLoop,
|
||||
ICFLoopSafetyInfo *SafetyInfo, MemorySSAUpdater &MSSAU,
|
||||
OptimizationRemarkEmitter *ORE);
|
||||
const Loop *CurLoop, ICFLoopSafetyInfo *SafetyInfo,
|
||||
MemorySSAUpdater &MSSAU, OptimizationRemarkEmitter *ORE);
|
||||
static bool isSafeToExecuteUnconditionally(
|
||||
Instruction &Inst, const DominatorTree *DT, const TargetLibraryInfo *TLI,
|
||||
const Loop *CurLoop, const LoopSafetyInfo *SafetyInfo,
|
||||
|
@ -179,8 +178,8 @@ collectPromotionCandidates(MemorySSA *MSSA, AliasAnalysis *AA, Loop *L);
|
|||
namespace {
|
||||
struct LoopInvariantCodeMotion {
|
||||
bool runOnLoop(Loop *L, AAResults *AA, LoopInfo *LI, DominatorTree *DT,
|
||||
BlockFrequencyInfo *BFI, TargetLibraryInfo *TLI,
|
||||
TargetTransformInfo *TTI, ScalarEvolution *SE, MemorySSA *MSSA,
|
||||
TargetLibraryInfo *TLI, TargetTransformInfo *TTI,
|
||||
ScalarEvolution *SE, MemorySSA *MSSA,
|
||||
OptimizationRemarkEmitter *ORE, bool LoopNestMode = false);
|
||||
|
||||
LoopInvariantCodeMotion(unsigned LicmMssaOptCap,
|
||||
|
@ -216,23 +215,19 @@ struct LegacyLICMPass : public LoopPass {
|
|||
|
||||
auto *SE = getAnalysisIfAvailable<ScalarEvolutionWrapperPass>();
|
||||
MemorySSA *MSSA = &getAnalysis<MemorySSAWrapperPass>().getMSSA();
|
||||
bool hasProfileData = L->getHeader()->getParent()->hasProfileData();
|
||||
BlockFrequencyInfo *BFI =
|
||||
hasProfileData ? &getAnalysis<LazyBlockFrequencyInfoPass>().getBFI()
|
||||
: nullptr;
|
||||
// For the old PM, we can't use OptimizationRemarkEmitter as an analysis
|
||||
// pass. Function analyses need to be preserved across loop transformations
|
||||
// but ORE cannot be preserved (see comment before the pass definition).
|
||||
OptimizationRemarkEmitter ORE(L->getHeader()->getParent());
|
||||
return LICM.runOnLoop(
|
||||
L, &getAnalysis<AAResultsWrapperPass>().getAAResults(),
|
||||
&getAnalysis<LoopInfoWrapperPass>().getLoopInfo(),
|
||||
&getAnalysis<DominatorTreeWrapperPass>().getDomTree(), BFI,
|
||||
&getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(
|
||||
*L->getHeader()->getParent()),
|
||||
&getAnalysis<TargetTransformInfoWrapperPass>().getTTI(
|
||||
*L->getHeader()->getParent()),
|
||||
SE ? &SE->getSE() : nullptr, MSSA, &ORE);
|
||||
return LICM.runOnLoop(L,
|
||||
&getAnalysis<AAResultsWrapperPass>().getAAResults(),
|
||||
&getAnalysis<LoopInfoWrapperPass>().getLoopInfo(),
|
||||
&getAnalysis<DominatorTreeWrapperPass>().getDomTree(),
|
||||
&getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(
|
||||
*L->getHeader()->getParent()),
|
||||
&getAnalysis<TargetTransformInfoWrapperPass>().getTTI(
|
||||
*L->getHeader()->getParent()),
|
||||
SE ? &SE->getSE() : nullptr, MSSA, &ORE);
|
||||
}
|
||||
|
||||
/// This transformation requires natural loop information & requires that
|
||||
|
@ -268,8 +263,8 @@ PreservedAnalyses LICMPass::run(Loop &L, LoopAnalysisManager &AM,
|
|||
|
||||
LoopInvariantCodeMotion LICM(Opts.MssaOptCap, Opts.MssaNoAccForPromotionCap,
|
||||
Opts.AllowSpeculation);
|
||||
if (!LICM.runOnLoop(&L, &AR.AA, &AR.LI, &AR.DT, AR.BFI, &AR.TLI, &AR.TTI,
|
||||
&AR.SE, AR.MSSA, &ORE))
|
||||
if (!LICM.runOnLoop(&L, &AR.AA, &AR.LI, &AR.DT, &AR.TLI, &AR.TTI, &AR.SE,
|
||||
AR.MSSA, &ORE))
|
||||
return PreservedAnalyses::all();
|
||||
|
||||
auto PA = getLoopPassPreservedAnalyses();
|
||||
|
@ -306,8 +301,8 @@ PreservedAnalyses LNICMPass::run(LoopNest &LN, LoopAnalysisManager &AM,
|
|||
Opts.AllowSpeculation);
|
||||
|
||||
Loop &OutermostLoop = LN.getOutermostLoop();
|
||||
bool Changed = LICM.runOnLoop(&OutermostLoop, &AR.AA, &AR.LI, &AR.DT, AR.BFI,
|
||||
&AR.TLI, &AR.TTI, &AR.SE, AR.MSSA, &ORE, true);
|
||||
bool Changed = LICM.runOnLoop(&OutermostLoop, &AR.AA, &AR.LI, &AR.DT, &AR.TLI,
|
||||
&AR.TTI, &AR.SE, AR.MSSA, &ORE, true);
|
||||
|
||||
if (!Changed)
|
||||
return PreservedAnalyses::all();
|
||||
|
@ -384,9 +379,8 @@ llvm::SinkAndHoistLICMFlags::SinkAndHoistLICMFlags(
|
|||
/// times on one loop.
|
||||
bool LoopInvariantCodeMotion::runOnLoop(
|
||||
Loop *L, AAResults *AA, LoopInfo *LI, DominatorTree *DT,
|
||||
BlockFrequencyInfo *BFI, TargetLibraryInfo *TLI, TargetTransformInfo *TTI,
|
||||
ScalarEvolution *SE, MemorySSA *MSSA, OptimizationRemarkEmitter *ORE,
|
||||
bool LoopNestMode) {
|
||||
TargetLibraryInfo *TLI, TargetTransformInfo *TTI, ScalarEvolution *SE,
|
||||
MemorySSA *MSSA, OptimizationRemarkEmitter *ORE, bool LoopNestMode) {
|
||||
bool Changed = false;
|
||||
|
||||
assert(L->isLCSSAForm(*DT) && "Loop is not in LCSSA form.");
|
||||
|
@ -435,15 +429,15 @@ bool LoopInvariantCodeMotion::runOnLoop(
|
|||
// us to sink instructions in one pass, without iteration. After sinking
|
||||
// instructions, we perform another pass to hoist them out of the loop.
|
||||
if (L->hasDedicatedExits())
|
||||
Changed |= LoopNestMode
|
||||
? sinkRegionForLoopNest(DT->getNode(L->getHeader()), AA, LI,
|
||||
DT, BFI, TLI, TTI, L, MSSAU,
|
||||
&SafetyInfo, Flags, ORE)
|
||||
: sinkRegion(DT->getNode(L->getHeader()), AA, LI, DT, BFI,
|
||||
TLI, TTI, L, MSSAU, &SafetyInfo, Flags, ORE);
|
||||
Changed |=
|
||||
LoopNestMode
|
||||
? sinkRegionForLoopNest(DT->getNode(L->getHeader()), AA, LI, DT,
|
||||
TLI, TTI, L, MSSAU, &SafetyInfo, Flags, ORE)
|
||||
: sinkRegion(DT->getNode(L->getHeader()), AA, LI, DT, TLI, TTI, L,
|
||||
MSSAU, &SafetyInfo, Flags, ORE);
|
||||
Flags.setIsSink(false);
|
||||
if (Preheader)
|
||||
Changed |= hoistRegion(DT->getNode(L->getHeader()), AA, LI, DT, BFI, TLI, L,
|
||||
Changed |= hoistRegion(DT->getNode(L->getHeader()), AA, LI, DT, TLI, L,
|
||||
MSSAU, SE, &SafetyInfo, Flags, ORE, LoopNestMode,
|
||||
LicmAllowSpeculation);
|
||||
|
||||
|
@ -526,10 +520,9 @@ bool LoopInvariantCodeMotion::runOnLoop(
|
|||
/// definitions, allowing us to sink a loop body in one pass without iteration.
|
||||
///
|
||||
bool llvm::sinkRegion(DomTreeNode *N, AAResults *AA, LoopInfo *LI,
|
||||
DominatorTree *DT, BlockFrequencyInfo *BFI,
|
||||
TargetLibraryInfo *TLI, TargetTransformInfo *TTI,
|
||||
Loop *CurLoop, MemorySSAUpdater &MSSAU,
|
||||
ICFLoopSafetyInfo *SafetyInfo,
|
||||
DominatorTree *DT, TargetLibraryInfo *TLI,
|
||||
TargetTransformInfo *TTI, Loop *CurLoop,
|
||||
MemorySSAUpdater &MSSAU, ICFLoopSafetyInfo *SafetyInfo,
|
||||
SinkAndHoistLICMFlags &Flags,
|
||||
OptimizationRemarkEmitter *ORE, Loop *OutermostLoop) {
|
||||
|
||||
|
@ -577,7 +570,7 @@ bool llvm::sinkRegion(DomTreeNode *N, AAResults *AA, LoopInfo *LI,
|
|||
isNotUsedOrFreeInLoop(I, LoopNestMode ? OutermostLoop : CurLoop,
|
||||
SafetyInfo, TTI, FreeInLoop, LoopNestMode) &&
|
||||
canSinkOrHoistInst(I, AA, DT, CurLoop, MSSAU, true, Flags, ORE)) {
|
||||
if (sink(I, LI, DT, BFI, CurLoop, SafetyInfo, MSSAU, ORE)) {
|
||||
if (sink(I, LI, DT, CurLoop, SafetyInfo, MSSAU, ORE)) {
|
||||
if (!FreeInLoop) {
|
||||
++II;
|
||||
salvageDebugInfo(I);
|
||||
|
@ -593,11 +586,13 @@ bool llvm::sinkRegion(DomTreeNode *N, AAResults *AA, LoopInfo *LI,
|
|||
return Changed;
|
||||
}
|
||||
|
||||
bool llvm::sinkRegionForLoopNest(
|
||||
DomTreeNode *N, AAResults *AA, LoopInfo *LI, DominatorTree *DT,
|
||||
BlockFrequencyInfo *BFI, TargetLibraryInfo *TLI, TargetTransformInfo *TTI,
|
||||
Loop *CurLoop, MemorySSAUpdater &MSSAU, ICFLoopSafetyInfo *SafetyInfo,
|
||||
SinkAndHoistLICMFlags &Flags, OptimizationRemarkEmitter *ORE) {
|
||||
bool llvm::sinkRegionForLoopNest(DomTreeNode *N, AAResults *AA, LoopInfo *LI,
|
||||
DominatorTree *DT, TargetLibraryInfo *TLI,
|
||||
TargetTransformInfo *TTI, Loop *CurLoop,
|
||||
MemorySSAUpdater &MSSAU,
|
||||
ICFLoopSafetyInfo *SafetyInfo,
|
||||
SinkAndHoistLICMFlags &Flags,
|
||||
OptimizationRemarkEmitter *ORE) {
|
||||
|
||||
bool Changed = false;
|
||||
SmallPriorityWorklist<Loop *, 4> Worklist;
|
||||
|
@ -605,8 +600,8 @@ bool llvm::sinkRegionForLoopNest(
|
|||
appendLoopsToWorklist(*CurLoop, Worklist);
|
||||
while (!Worklist.empty()) {
|
||||
Loop *L = Worklist.pop_back_val();
|
||||
Changed |= sinkRegion(DT->getNode(L->getHeader()), AA, LI, DT, BFI, TLI,
|
||||
TTI, L, MSSAU, SafetyInfo, Flags, ORE, CurLoop);
|
||||
Changed |= sinkRegion(DT->getNode(L->getHeader()), AA, LI, DT, TLI, TTI, L,
|
||||
MSSAU, SafetyInfo, Flags, ORE, CurLoop);
|
||||
}
|
||||
return Changed;
|
||||
}
|
||||
|
@ -845,8 +840,7 @@ public:
|
|||
/// uses, allowing us to hoist a loop body in one pass without iteration.
|
||||
///
|
||||
bool llvm::hoistRegion(DomTreeNode *N, AAResults *AA, LoopInfo *LI,
|
||||
DominatorTree *DT, BlockFrequencyInfo *BFI,
|
||||
TargetLibraryInfo *TLI, Loop *CurLoop,
|
||||
DominatorTree *DT, TargetLibraryInfo *TLI, Loop *CurLoop,
|
||||
MemorySSAUpdater &MSSAU, ScalarEvolution *SE,
|
||||
ICFLoopSafetyInfo *SafetyInfo,
|
||||
SinkAndHoistLICMFlags &Flags,
|
||||
|
@ -1588,9 +1582,8 @@ static void splitPredecessorsOfLoopExit(PHINode *PN, DominatorTree *DT,
|
|||
/// position, and may either delete it or move it to outside of the loop.
|
||||
///
|
||||
static bool sink(Instruction &I, LoopInfo *LI, DominatorTree *DT,
|
||||
BlockFrequencyInfo *BFI, const Loop *CurLoop,
|
||||
ICFLoopSafetyInfo *SafetyInfo, MemorySSAUpdater &MSSAU,
|
||||
OptimizationRemarkEmitter *ORE) {
|
||||
const Loop *CurLoop, ICFLoopSafetyInfo *SafetyInfo,
|
||||
MemorySSAUpdater &MSSAU, OptimizationRemarkEmitter *ORE) {
|
||||
bool Changed = false;
|
||||
LLVM_DEBUG(dbgs() << "LICM sinking instruction: " << I << "\n");
|
||||
|
||||
|
|
Loading…
Reference in New Issue