From 1cffa20e9d89095c552ca3335587cde488b74afa Mon Sep 17 00:00:00 2001 From: Alina Sbirlea Date: Mon, 30 Sep 2019 17:23:49 +0000 Subject: [PATCH] [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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@373235 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Pass.h | 2 ++ lib/IR/LegacyPassManager.cpp | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/include/llvm/Pass.h b/include/llvm/Pass.h index 329f7eaba73..d36555cc7e7 100644 --- a/include/llvm/Pass.h +++ b/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/lib/IR/LegacyPassManager.cpp b/lib/IR/LegacyPassManager.cpp index f03df2dec7c..3a03c493100 100644 --- a/lib/IR/LegacyPassManager.cpp +++ b/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 -- 2.40.0