diff options
author | Alina Sbirlea <asbirlea@google.com> | 2019-09-30 17:23:49 +0000 |
---|---|---|
committer | Alina Sbirlea <asbirlea@google.com> | 2019-09-30 17:23:49 +0000 |
commit | ad888846585f2b69808fd1d041cf6818c21905da (patch) | |
tree | 536b4f6bfd0701ea30c09a6648b41efbce3a9baf | |
parent | 299ebacfe93d205532dcdd9e5e4f7828b678242d (diff) | |
download | bcm5719-llvm-ad888846585f2b69808fd1d041cf6818c21905da.tar.gz bcm5719-llvm-ad888846585f2b69808fd1d041cf6818c21905da.zip |
[LegacyPassManager] Attempt to fix BasicBlockManager
Temporarily fix BaiscBlockManager based on the code in the other
managers.
Replacement of all uses of the BasicBlockPass to follow.
Resolves PR42264.
llvm-svn: 373235
-rw-r--r-- | llvm/include/llvm/Pass.h | 2 | ||||
-rw-r--r-- | llvm/lib/IR/LegacyPassManager.cpp | 19 |
2 files changed, 21 insertions, 0 deletions
diff --git a/llvm/include/llvm/Pass.h b/llvm/include/llvm/Pass.h index 329f7eaba73..d36555cc7e7 100644 --- a/llvm/include/llvm/Pass.h +++ b/llvm/include/llvm/Pass.h @@ -338,6 +338,8 @@ public: /// do any post processing needed after all passes have run. virtual bool doFinalization(Function &); + void preparePassManager(PMStack &PMS) override; + void assignPassManager(PMStack &PMS, PassManagerType T) override; /// Return what kind of Pass Manager can manage this pass. diff --git a/llvm/lib/IR/LegacyPassManager.cpp b/llvm/lib/IR/LegacyPassManager.cpp index f03df2dec7c..3a03c493100 100644 --- a/llvm/lib/IR/LegacyPassManager.cpp +++ b/llvm/lib/IR/LegacyPassManager.cpp @@ -1998,10 +1998,28 @@ void FunctionPass::assignPassManager(PMStack &PMS, FPP->add(this); } +void BasicBlockPass::preparePassManager(PMStack &PMS) { + // Find BBPassManager + while (!PMS.empty() && + PMS.top()->getPassManagerType() > PMT_BasicBlockPassManager) + PMS.pop(); + + // If this pass is destroying high level information that is used + // by other passes that are managed by BBPM then do not insert + // this pass in current BBPM. Use new BBPassManager. + if (PMS.top()->getPassManagerType() == PMT_BasicBlockPassManager && + !PMS.top()->preserveHigherLevelAnalysis(this)) + PMS.pop(); +} + /// Find appropriate Basic Pass Manager or Call Graph Pass Manager /// in the PM Stack and add self into that manager. void BasicBlockPass::assignPassManager(PMStack &PMS, PassManagerType PreferredType) { + while (!PMS.empty() && + PMS.top()->getPassManagerType() > PMT_BasicBlockPassManager) + PMS.pop(); + BBPassManager *BBP; // Basic Pass Manager is a leaf pass manager. It does not handle @@ -2017,6 +2035,7 @@ void BasicBlockPass::assignPassManager(PMStack &PMS, // [1] Create new Basic Block Manager BBP = new BBPassManager(); + BBP->populateInheritedAnalysis(PMS); // [2] Set up new manager's top level manager // Basic Block Pass Manager does not live by itself |