summaryrefslogtreecommitdiffstats
path: root/llvm/lib/IR/LegacyPassManager.cpp
diff options
context:
space:
mode:
authorSerge Pavlov <sepavloff@gmail.com>2017-01-13 06:09:54 +0000
committerSerge Pavlov <sepavloff@gmail.com>2017-01-13 06:09:54 +0000
commitd409411ef195329a24cea00589e9853ab6a5ace8 (patch)
tree31459227034048c2e1e5274200e73d075317eb6e /llvm/lib/IR/LegacyPassManager.cpp
parentd30e6f7421f4b319f1203d660bbc89f09d8944f7 (diff)
downloadbcm5719-llvm-d409411ef195329a24cea00589e9853ab6a5ace8.tar.gz
bcm5719-llvm-d409411ef195329a24cea00589e9853ab6a5ace8.zip
Track validity of pass results
Running tests with expensive checks enabled exhibits some problems with verification of pass results. First, the pass verification may require results of analysis that are not available. For instance, verification of loop info requires results of dominator tree analysis. A pass may be marked as conserving loop info but does not need to be dependent on DominatorTreePass. When a pass manager tries to verify that loop info is valid, it needs dominator tree, but corresponding analysis may be already destroyed as no user of it remained. Another case is a pass that is skipped. For instance, entities with linkage available_externally do not need code generation and such passes are skipped for them. In this case result verification must also be skipped. To solve these problems this change introduces a special flag to the Pass structure to mark passes that have valid results. If this flag is reset, verifications dependent on the pass result are skipped. Differential Revision: https://reviews.llvm.org/D27190 llvm-svn: 291882
Diffstat (limited to 'llvm/lib/IR/LegacyPassManager.cpp')
-rw-r--r--llvm/lib/IR/LegacyPassManager.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/llvm/lib/IR/LegacyPassManager.cpp b/llvm/lib/IR/LegacyPassManager.cpp
index 628a67bd639..0b2c40b742a 100644
--- a/llvm/lib/IR/LegacyPassManager.cpp
+++ b/llvm/lib/IR/LegacyPassManager.cpp
@@ -955,6 +955,9 @@ void PMDataManager::freePass(Pass *P, StringRef Msg,
AvailableAnalysis.erase(Pos);
}
}
+
+ if (!P->getAsImmutablePass())
+ P->setExecuted(false);
}
/// Add pass P into the PassVector. Update
@@ -1293,6 +1296,7 @@ bool BBPassManager::runOnFunction(Function &F) {
PassManagerPrettyStackEntry X(BP, *I);
TimeRegion PassTimer(getPassTimer(BP));
+ BP->setExecuted(true);
LocalChanged |= BP->runOnBasicBlock(*I);
}
@@ -1459,7 +1463,9 @@ bool FunctionPassManagerImpl::run(Function &F) {
initializeAllAnalysisInfo();
for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
- Changed |= getContainedManager(Index)->runOnFunction(F);
+ FPPassManager *P = getContainedManager(Index);
+ P->setExecuted(true);
+ Changed |= P->runOnFunction(F);
F.getContext().yield();
}
@@ -1510,6 +1516,7 @@ bool FPPassManager::runOnFunction(Function &F) {
PassManagerPrettyStackEntry X(FP, F);
TimeRegion PassTimer(getPassTimer(FP));
+ FP->setExecuted(true);
LocalChanged |= FP->runOnFunction(F);
}
@@ -1530,8 +1537,10 @@ bool FPPassManager::runOnFunction(Function &F) {
bool FPPassManager::runOnModule(Module &M) {
bool Changed = false;
- for (Function &F : M)
+ for (Function &F : M) {
+ setExecuted(true);
Changed |= runOnFunction(F);
+ }
return Changed;
}
@@ -1587,6 +1596,7 @@ MPPassManager::runOnModule(Module &M) {
PassManagerPrettyStackEntry X(MP, M);
TimeRegion PassTimer(getPassTimer(MP));
+ MP->setExecuted(true);
LocalChanged |= MP->runOnModule(M);
}
@@ -1690,7 +1700,9 @@ bool PassManagerImpl::run(Module &M) {
initializeAllAnalysisInfo();
for (unsigned Index = 0; Index < getNumContainedManagers(); ++Index) {
- Changed |= getContainedManager(Index)->runOnModule(M);
+ MPPassManager *P = getContainedManager(Index);
+ P->setExecuted(true);
+ Changed |= P->runOnModule(M);
M.getContext().yield();
}
OpenPOWER on IntegriCloud