forked from OSchip/llvm-project
[IndVarSimplify] Extract the logic of `-indvars` out into a class; NFC
This will be used later to port IndVarSimplify to the new pass manager. llvm-svn: 271190
This commit is contained in:
parent
9c53a638cb
commit
496f274257
|
@ -152,7 +152,7 @@ void initializeIPSCCPLegacyPassPass(PassRegistry &);
|
|||
void initializeIVUsersPass(PassRegistry&);
|
||||
void initializeIfConverterPass(PassRegistry&);
|
||||
void initializeInductiveRangeCheckEliminationPass(PassRegistry&);
|
||||
void initializeIndVarSimplifyPass(PassRegistry&);
|
||||
void initializeIndVarSimplifyLegacyPassPass(PassRegistry&);
|
||||
void initializeInferFunctionAttrsLegacyPassPass(PassRegistry&);
|
||||
void initializeInlineCostAnalysisPass(PassRegistry&);
|
||||
void initializeInstructionCombiningPassPass(PassRegistry&);
|
||||
|
|
|
@ -86,34 +86,16 @@ static cl::opt<ReplaceExitVal> ReplaceExitValue(
|
|||
namespace {
|
||||
struct RewritePhi;
|
||||
|
||||
class IndVarSimplify : public LoopPass {
|
||||
LoopInfo *LI;
|
||||
ScalarEvolution *SE;
|
||||
DominatorTree *DT;
|
||||
TargetLibraryInfo *TLI;
|
||||
class IndVarSimplify {
|
||||
LoopInfo *LI;
|
||||
ScalarEvolution *SE;
|
||||
DominatorTree *DT;
|
||||
const DataLayout &DL;
|
||||
TargetLibraryInfo *TLI;
|
||||
const TargetTransformInfo *TTI;
|
||||
|
||||
SmallVector<WeakVH, 16> DeadInsts;
|
||||
bool Changed;
|
||||
public:
|
||||
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
IndVarSimplify()
|
||||
: LoopPass(ID), LI(nullptr), SE(nullptr), DT(nullptr), Changed(false) {
|
||||
initializeIndVarSimplifyPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
bool runOnLoop(Loop *L, LPPassManager &LPM) override;
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.setPreservesCFG();
|
||||
getLoopAnalysisUsage(AU);
|
||||
}
|
||||
|
||||
private:
|
||||
void releaseMemory() override {
|
||||
DeadInsts.clear();
|
||||
}
|
||||
bool Changed = false;
|
||||
|
||||
bool isValidRewrite(Value *FromVal, Value *ToVal);
|
||||
|
||||
|
@ -133,20 +115,17 @@ private:
|
|||
|
||||
Value *expandSCEVIfNeeded(SCEVExpander &Rewriter, const SCEV *S, Loop *L,
|
||||
Instruction *InsertPt, Type *Ty);
|
||||
|
||||
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) {}
|
||||
|
||||
bool run(Loop *L);
|
||||
};
|
||||
}
|
||||
|
||||
char IndVarSimplify::ID = 0;
|
||||
INITIALIZE_PASS_BEGIN(IndVarSimplify, "indvars",
|
||||
"Induction Variable Simplification", false, false)
|
||||
INITIALIZE_PASS_DEPENDENCY(LoopPass)
|
||||
INITIALIZE_PASS_END(IndVarSimplify, "indvars",
|
||||
"Induction Variable Simplification", false, false)
|
||||
|
||||
Pass *llvm::createIndVarSimplifyPass() {
|
||||
return new IndVarSimplify();
|
||||
}
|
||||
|
||||
/// Return true if the SCEV expansion generated by the rewriter can replace the
|
||||
/// original value. SCEV guarantees that it produces the same value, but the way
|
||||
/// it is produced may be illegal IR. Ideally, this function will only be
|
||||
|
@ -2121,10 +2100,7 @@ void IndVarSimplify::sinkUnusedInvariants(Loop *L) {
|
|||
// IndVarSimplify driver. Manage several subpasses of IV simplification.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||
if (skipLoop(L))
|
||||
return false;
|
||||
|
||||
bool IndVarSimplify::run(Loop *L) {
|
||||
// If LoopSimplify form is not available, stay out of trouble. Some notes:
|
||||
// - LSR currently only supports LoopSimplify-form loops. Indvars'
|
||||
// canonicalization can be a pessimization without LSR to "clean up"
|
||||
|
@ -2136,18 +2112,6 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
|
|||
if (!L->isLoopSimplifyForm())
|
||||
return false;
|
||||
|
||||
LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
|
||||
SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
|
||||
DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||
auto *TLIP = getAnalysisIfAvailable<TargetLibraryInfoWrapperPass>();
|
||||
TLI = TLIP ? &TLIP->getTLI() : nullptr;
|
||||
auto *TTIP = getAnalysisIfAvailable<TargetTransformInfoWrapperPass>();
|
||||
TTI = TTIP ? &TTIP->getTTI(*L->getHeader()->getParent()) : nullptr;
|
||||
const DataLayout &DL = L->getHeader()->getModule()->getDataLayout();
|
||||
|
||||
DeadInsts.clear();
|
||||
Changed = false;
|
||||
|
||||
// If there are any floating-point recurrences, attempt to
|
||||
// transform them to use integer recurrences.
|
||||
rewriteNonIntegerIVs(L);
|
||||
|
@ -2249,3 +2213,45 @@ bool IndVarSimplify::runOnLoop(Loop *L, LPPassManager &LPM) {
|
|||
|
||||
return Changed;
|
||||
}
|
||||
|
||||
namespace {
|
||||
struct IndVarSimplifyLegacyPass : public LoopPass {
|
||||
static char ID; // Pass identification, replacement for typeid
|
||||
IndVarSimplifyLegacyPass() : LoopPass(ID) {
|
||||
initializeIndVarSimplifyLegacyPassPass(*PassRegistry::getPassRegistry());
|
||||
}
|
||||
|
||||
bool runOnLoop(Loop *L, LPPassManager &LPM) override {
|
||||
if (skipLoop(L))
|
||||
return false;
|
||||
|
||||
auto *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
|
||||
auto *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
|
||||
auto *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||
auto *TLIP = getAnalysisIfAvailable<TargetLibraryInfoWrapperPass>();
|
||||
auto *TLI = TLIP ? &TLIP->getTLI() : nullptr;
|
||||
auto *TTIP = getAnalysisIfAvailable<TargetTransformInfoWrapperPass>();
|
||||
auto *TTI = TTIP ? &TTIP->getTTI(*L->getHeader()->getParent()) : nullptr;
|
||||
const DataLayout &DL = L->getHeader()->getModule()->getDataLayout();
|
||||
|
||||
IndVarSimplify IVS(LI, SE, DT, DL, TLI, TTI);
|
||||
return IVS.run(L);
|
||||
}
|
||||
|
||||
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
||||
AU.setPreservesCFG();
|
||||
getLoopAnalysisUsage(AU);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
char IndVarSimplifyLegacyPass::ID = 0;
|
||||
INITIALIZE_PASS_BEGIN(IndVarSimplifyLegacyPass, "indvars",
|
||||
"Induction Variable Simplification", false, false)
|
||||
INITIALIZE_PASS_DEPENDENCY(LoopPass)
|
||||
INITIALIZE_PASS_END(IndVarSimplifyLegacyPass, "indvars",
|
||||
"Induction Variable Simplification", false, false)
|
||||
|
||||
Pass *llvm::createIndVarSimplifyPass() {
|
||||
return new IndVarSimplifyLegacyPass();
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ void llvm::initializeScalarOpts(PassRegistry &Registry) {
|
|||
initializeEarlyCSELegacyPassPass(Registry);
|
||||
initializeFlattenCFGPassPass(Registry);
|
||||
initializeInductiveRangeCheckEliminationPass(Registry);
|
||||
initializeIndVarSimplifyPass(Registry);
|
||||
initializeIndVarSimplifyLegacyPassPass(Registry);
|
||||
initializeJumpThreadingPass(Registry);
|
||||
initializeLICMPass(Registry);
|
||||
initializeLoopDataPrefetchPass(Registry);
|
||||
|
|
Loading…
Reference in New Issue