diff options
author | Xin Tong <trent.xin.tong@gmail.com> | 2018-07-22 05:27:41 +0000 |
---|---|---|
committer | Xin Tong <trent.xin.tong@gmail.com> | 2018-07-22 05:27:41 +0000 |
commit | a747d6134aada23da1df97e526005d0c1a8a4155 (patch) | |
tree | 48e1b8a39d4f02cfb0f97be8b265548f3864cf9a | |
parent | 7a0e9e5b05438f5b4a88987a6ef303a6aa1802d6 (diff) |
[ORE] Move loop invariant ORE checks outside the PM loop.
Summary:
This takes 22ms out of ~20s compiling sqlite3.c because we call it
for every unit of compilation and every pass.
Reviewers: paquette, anemet
Subscribers: mehdi_amini, llvm-commits
Differential Revision: https://reviews.llvm.org/D49586
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337654 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/IR/Module.h | 13 | ||||
-rw-r--r-- | lib/Analysis/CallGraphSCCPass.cpp | 8 | ||||
-rw-r--r-- | lib/Analysis/LoopPass.cpp | 8 | ||||
-rw-r--r-- | lib/IR/LegacyPassManager.cpp | 32 |
4 files changed, 41 insertions, 20 deletions
diff --git a/include/llvm/IR/Module.h b/include/llvm/IR/Module.h index 500e3a50dee..a405f7df3ef 100644 --- a/include/llvm/IR/Module.h +++ b/include/llvm/IR/Module.h @@ -256,9 +256,16 @@ public: /// versions when the pass does not change. std::unique_ptr<RandomNumberGenerator> createRNG(const Pass* P) const; -/// @} -/// @name Module Level Mutators -/// @{ + /// Return true if size-info optimization remark is enabled, false + /// otherwise. + bool shouldEmitInstrCountChangedRemark() { + return getContext().getDiagHandlerPtr()->isAnalysisRemarkEnabled( + "size-info"); + } + + /// @} + /// @name Module Level Mutators + /// @{ /// Set the module identifier. void setModuleIdentifier(StringRef ID) { ModuleID = ID; } diff --git a/lib/Analysis/CallGraphSCCPass.cpp b/lib/Analysis/CallGraphSCCPass.cpp index ef61c65463f..f2211edba21 100644 --- a/lib/Analysis/CallGraphSCCPass.cpp +++ b/lib/Analysis/CallGraphSCCPass.cpp @@ -130,13 +130,17 @@ bool CGPassManager::RunPassOnSCC(Pass *P, CallGraphSCC &CurSCC, } { + unsigned InstrCount = 0; + bool EmitICRemark = M.shouldEmitInstrCountChangedRemark(); TimeRegion PassTimer(getPassTimer(CGSP)); - unsigned InstrCount = initSizeRemarkInfo(M); + if (EmitICRemark) + InstrCount = initSizeRemarkInfo(M); Changed = CGSP->runOnSCC(CurSCC); // If the pass modified the module, it may have modified the instruction // count of the module. Try emitting a remark. - emitInstrCountChangedRemark(P, M, InstrCount); + if (EmitICRemark) + emitInstrCountChangedRemark(P, M, InstrCount); } // After the CGSCCPass is done, when assertions are enabled, use diff --git a/lib/Analysis/LoopPass.cpp b/lib/Analysis/LoopPass.cpp index c5ced03cfa8..07a151ce0fc 100644 --- a/lib/Analysis/LoopPass.cpp +++ b/lib/Analysis/LoopPass.cpp @@ -193,6 +193,8 @@ bool LPPassManager::runOnFunction(Function &F) { } // Walk Loops + unsigned InstrCount = 0; + bool EmitICRemark = M.shouldEmitInstrCountChangedRemark(); while (!LQ.empty()) { CurrentLoopDeleted = false; CurrentLoop = LQ.back(); @@ -210,9 +212,11 @@ bool LPPassManager::runOnFunction(Function &F) { { PassManagerPrettyStackEntry X(P, *CurrentLoop->getHeader()); TimeRegion PassTimer(getPassTimer(P)); - unsigned InstrCount = initSizeRemarkInfo(M); + if (EmitICRemark) + InstrCount = initSizeRemarkInfo(M); Changed |= P->runOnLoop(CurrentLoop, *this); - emitInstrCountChangedRemark(P, M, InstrCount); + if (EmitICRemark) + emitInstrCountChangedRemark(P, M, InstrCount); } if (Changed) diff --git a/lib/IR/LegacyPassManager.cpp b/lib/IR/LegacyPassManager.cpp index cd130ba2865..54d602d926e 100644 --- a/lib/IR/LegacyPassManager.cpp +++ b/lib/IR/LegacyPassManager.cpp @@ -137,17 +137,11 @@ bool PMDataManager::isPassDebuggingExecutionsOrMore() const { unsigned PMDataManager::initSizeRemarkInfo(Module &M) { // Only calculate getInstructionCount if the size-info remark is requested. - if (M.getContext().getDiagHandlerPtr()->isAnalysisRemarkEnabled("size-info")) - return M.getInstructionCount(); - return 0; + return M.getInstructionCount(); } void PMDataManager::emitInstrCountChangedRemark(Pass *P, Module &M, unsigned CountBefore) { - // Did the user request the remark? If not, quit. - if (!M.getContext().getDiagHandlerPtr()->isAnalysisRemarkEnabled("size-info")) - return; - // We need a function containing at least one basic block in order to output // remarks. Since it's possible that the first function in the module doesn't // actually contain a basic block, we have to go and find one that's suitable @@ -1349,6 +1343,8 @@ bool BBPassManager::runOnFunction(Function &F) { bool Changed = doInitialization(F); Module &M = *F.getParent(); + unsigned InstrCount = 0; + bool EmitICRemark = M.shouldEmitInstrCountChangedRemark(); for (BasicBlock &BB : F) for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { BasicBlockPass *BP = getContainedPass(Index); @@ -1363,9 +1359,11 @@ bool BBPassManager::runOnFunction(Function &F) { // If the pass crashes, remember this. PassManagerPrettyStackEntry X(BP, BB); TimeRegion PassTimer(getPassTimer(BP)); - unsigned InstrCount = initSizeRemarkInfo(M); + if (EmitICRemark) + InstrCount = initSizeRemarkInfo(M); LocalChanged |= BP->runOnBasicBlock(BB); - emitInstrCountChangedRemark(BP, M, InstrCount); + if (EmitICRemark) + emitInstrCountChangedRemark(BP, M, InstrCount); } Changed |= LocalChanged; @@ -1569,6 +1567,8 @@ bool FPPassManager::runOnFunction(Function &F) { // Collect inherited analysis from Module level pass manager. populateInheritedAnalysis(TPM->activeStack); + unsigned InstrCount = 0; + bool EmitICRemark = M.shouldEmitInstrCountChangedRemark(); for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { FunctionPass *FP = getContainedPass(Index); bool LocalChanged = false; @@ -1581,9 +1581,11 @@ bool FPPassManager::runOnFunction(Function &F) { { PassManagerPrettyStackEntry X(FP, F); TimeRegion PassTimer(getPassTimer(FP)); - unsigned InstrCount = initSizeRemarkInfo(M); + if (EmitICRemark) + InstrCount = initSizeRemarkInfo(M); LocalChanged |= FP->runOnFunction(F); - emitInstrCountChangedRemark(FP, M, InstrCount); + if (EmitICRemark) + emitInstrCountChangedRemark(FP, M, InstrCount); } Changed |= LocalChanged; @@ -1647,6 +1649,8 @@ MPPassManager::runOnModule(Module &M) { for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) Changed |= getContainedPass(Index)->doInitialization(M); + unsigned InstrCount = 0; + bool EmitICRemark = M.shouldEmitInstrCountChangedRemark(); for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { ModulePass *MP = getContainedPass(Index); bool LocalChanged = false; @@ -1660,9 +1664,11 @@ MPPassManager::runOnModule(Module &M) { PassManagerPrettyStackEntry X(MP, M); TimeRegion PassTimer(getPassTimer(MP)); - unsigned InstrCount = initSizeRemarkInfo(M); + if (EmitICRemark) + InstrCount = initSizeRemarkInfo(M); LocalChanged |= MP->runOnModule(M); - emitInstrCountChangedRemark(MP, M, InstrCount); + if (EmitICRemark) + emitInstrCountChangedRemark(MP, M, InstrCount); } Changed |= LocalChanged; |