165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser//===- RegionPass.cpp - Region Pass and Region Pass Manager ---------------===// 265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// 365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// The LLVM Compiler Infrastructure 465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// 565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// This file is distributed under the University of Illinois Open Source 665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// License. See LICENSE.TXT for details. 765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// 865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser//===----------------------------------------------------------------------===// 965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// 1065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// This file implements RegionPass and RGPassManager. All region optimization 1165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// and transformation passes are derived from RegionPass. RGPassManager is 1265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// responsible for managing RegionPasses. 1365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// most of these codes are COPY from LoopPass.cpp 1465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// 1565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser//===----------------------------------------------------------------------===// 1665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser#include "llvm/Analysis/RegionPass.h" 1765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser#include "llvm/Analysis/RegionIterator.h" 1865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser#include "llvm/Support/Timer.h" 1965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 2065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser#define DEBUG_TYPE "regionpassmgr" 2165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser#include "llvm/Support/Debug.h" 2265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosserusing namespace llvm; 2365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 2465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser//===----------------------------------------------------------------------===// 2565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// RGPassManager 2665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// 2765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 2865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosserchar RGPassManager::ID = 0; 2965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 300e122d1c2422285c872f68fc0ae1f7e5d2739572Andrew TrickRGPassManager::RGPassManager() 310e122d1c2422285c872f68fc0ae1f7e5d2739572Andrew Trick : FunctionPass(ID), PMDataManager() { 3265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser skipThisRegion = false; 3365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser redoThisRegion = false; 3465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser RI = NULL; 3565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser CurrentRegion = NULL; 3665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser} 3765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 3865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// Recurse through all subregions and all regions into RQ. 3965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosserstatic void addRegionIntoQueue(Region *R, std::deque<Region *> &RQ) { 4065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser RQ.push_back(R); 4165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser for (Region::iterator I = R->begin(), E = R->end(); I != E; ++I) 4265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser addRegionIntoQueue(*I, RQ); 4365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser} 4465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 4565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser/// Pass Manager itself does not invalidate any analysis info. 4665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosservoid RGPassManager::getAnalysisUsage(AnalysisUsage &Info) const { 4765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser Info.addRequired<RegionInfo>(); 4865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser Info.setPreservesAll(); 4965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser} 5065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 5165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser/// run - Execute all of the passes scheduled for execution. Keep track of 5265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser/// whether any of the passes modifies the function, and if so, return true. 5365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosserbool RGPassManager::runOnFunction(Function &F) { 5465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser RI = &getAnalysis<RegionInfo>(); 5565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser bool Changed = false; 5665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 5765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // Collect inherited analysis from Module level pass manager. 5865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser populateInheritedAnalysis(TPM->activeStack); 5965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 6065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser addRegionIntoQueue(RI->getTopLevelRegion(), RQ); 6165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 6265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser if (RQ.empty()) // No regions, skip calling finalizers 6365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser return false; 6465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 6565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // Initialization 6665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser for (std::deque<Region *>::const_iterator I = RQ.begin(), E = RQ.end(); 6765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser I != E; ++I) { 6865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser Region *R = *I; 6965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 7065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser RegionPass *RP = (RegionPass *)getContainedPass(Index); 7165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser Changed |= RP->doInitialization(R, *this); 7265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 7365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 7465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 7565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // Walk Regions 7665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser while (!RQ.empty()) { 7765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 7865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser CurrentRegion = RQ.back(); 7965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser skipThisRegion = false; 8065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser redoThisRegion = false; 8165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 8265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // Run all passes on the current Region. 8365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 8465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser RegionPass *P = (RegionPass*)getContainedPass(Index); 8565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 8665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser dumpPassInfo(P, EXECUTION_MSG, ON_REGION_MSG, 8765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser CurrentRegion->getNameStr()); 8865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser dumpRequiredSet(P); 8965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 9065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser initializeAnalysisImpl(P); 9165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 9265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser { 9365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser PassManagerPrettyStackEntry X(P, *CurrentRegion->getEntry()); 9465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 9565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser TimeRegion PassTimer(getPassTimer(P)); 9665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser Changed |= P->runOnRegion(CurrentRegion, *this); 9765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 9865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 9965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser if (Changed) 10065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser dumpPassInfo(P, MODIFICATION_MSG, ON_REGION_MSG, 10165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser skipThisRegion ? "<deleted>" : 10265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser CurrentRegion->getNameStr()); 10365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser dumpPreservedSet(P); 10465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 10565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser if (!skipThisRegion) { 10665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // Manually check that this region is still healthy. This is done 10765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // instead of relying on RegionInfo::verifyRegion since RegionInfo 10865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // is a function pass and it's really expensive to verify every 10965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // Region in the function every time. That level of checking can be 11065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // enabled with the -verify-region-info option. 11165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser { 11265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser TimeRegion PassTimer(getPassTimer(P)); 11365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser CurrentRegion->verifyRegion(); 11465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 11565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 11665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // Then call the regular verifyAnalysis functions. 11765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser verifyPreservedAnalysis(P); 11865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 11965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 12065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser removeNotPreservedAnalysis(P); 12165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser recordAvailableAnalysis(P); 12265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser removeDeadPasses(P, 12365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser skipThisRegion ? "<deleted>" : 12465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser CurrentRegion->getNameStr(), 12565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser ON_REGION_MSG); 12665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 12765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser if (skipThisRegion) 12865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // Do not run other passes on this region. 12965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser break; 13065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 13165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 13265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // If the region was deleted, release all the region passes. This frees up 13365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // some memory, and avoids trouble with the pass manager trying to call 13465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // verifyAnalysis on them. 13565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser if (skipThisRegion) 13665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 13765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser Pass *P = getContainedPass(Index); 13865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser freePass(P, "<deleted>", ON_REGION_MSG); 13965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 14065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 14165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // Pop the region from queue after running all passes. 14265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser RQ.pop_back(); 14365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 14465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser if (redoThisRegion) 14565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser RQ.push_back(CurrentRegion); 14665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 14765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // Free all region nodes created in region passes. 14865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser RI->clearNodeCache(); 14965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 15065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 15165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // Finalization 15265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 15365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser RegionPass *P = (RegionPass*)getContainedPass(Index); 15465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser Changed |= P->doFinalization(); 15565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 15665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 15765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // Print the region tree after all pass. 15865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser DEBUG( 15965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser dbgs() << "\nRegion tree of function " << F.getName() 16065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser << " after all region Pass:\n"; 16165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser RI->dump(); 16265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser dbgs() << "\n"; 16365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser ); 16465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 16565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser return Changed; 16665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser} 16765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 16865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser/// Print passes managed by this manager 16965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosservoid RGPassManager::dumpPassStructure(unsigned Offset) { 17065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser errs().indent(Offset*2) << "Region Pass Manager\n"; 17165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser for (unsigned Index = 0; Index < getNumContainedPasses(); ++Index) { 17265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser Pass *P = getContainedPass(Index); 17365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser P->dumpPassStructure(Offset + 1); 17465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser dumpLastUses(P, Offset+1); 17565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 17665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser} 17765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 17865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grossernamespace { 17965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser//===----------------------------------------------------------------------===// 18065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// PrintRegionPass 18165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosserclass PrintRegionPass : public RegionPass { 18265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosserprivate: 18365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser std::string Banner; 18465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser raw_ostream &Out; // raw_ostream to print on. 18565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 18665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosserpublic: 18765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser static char ID; 18865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser PrintRegionPass() : RegionPass(ID), Out(dbgs()) {} 18965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser PrintRegionPass(const std::string &B, raw_ostream &o) 19065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser : RegionPass(ID), Banner(B), Out(o) {} 19165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 19265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser virtual void getAnalysisUsage(AnalysisUsage &AU) const { 19365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser AU.setPreservesAll(); 19465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 19565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 19665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser virtual bool runOnRegion(Region *R, RGPassManager &RGM) { 19765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser Out << Banner; 19823a22a29441b8b7d948e6ff7c2afb39e6528cfbdHongbin Zheng for (Region::block_iterator I = R->block_begin(), E = R->block_end(); 19965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser I != E; ++I) 20023a22a29441b8b7d948e6ff7c2afb39e6528cfbdHongbin Zheng (*I)->print(Out); 20165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 20265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser return false; 20365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 20465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser}; 20565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 20665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosserchar PrintRegionPass::ID = 0; 20765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser} //end anonymous namespace 20865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 20965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser//===----------------------------------------------------------------------===// 21065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// RegionPass 21165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 21265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// Check if this pass is suitable for the current RGPassManager, if 21365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// available. This pass P is not suitable for a RGPassManager if P 21465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// is not preserving higher level analysis info used by other 21565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// RGPassManager passes. In such case, pop RGPassManager from the 21665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// stack. This will force assignPassManager() to create new 21765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser// LPPassManger as expected. 21865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosservoid RegionPass::preparePassManager(PMStack &PMS) { 21965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 22065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // Find RGPassManager 22165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser while (!PMS.empty() && 22265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser PMS.top()->getPassManagerType() > PMT_RegionPassManager) 22365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser PMS.pop(); 22465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 22565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 22665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // If this pass is destroying high level information that is used 22765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // by other passes that are managed by LPM then do not insert 22865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // this pass in current LPM. Use new RGPassManager. 22965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser if (PMS.top()->getPassManagerType() == PMT_RegionPassManager && 23065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser !PMS.top()->preserveHigherLevelAnalysis(this)) 23165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser PMS.pop(); 23265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser} 23365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 23465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser/// Assign pass manager to manage this pass. 23565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosservoid RegionPass::assignPassManager(PMStack &PMS, 23665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser PassManagerType PreferredType) { 23765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // Find RGPassManager 23865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser while (!PMS.empty() && 23965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser PMS.top()->getPassManagerType() > PMT_RegionPassManager) 24065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser PMS.pop(); 24165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 24265513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser RGPassManager *RGPM; 24365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 24465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // Create new Region Pass Manager if it does not exist. 24565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser if (PMS.top()->getPassManagerType() == PMT_RegionPassManager) 24665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser RGPM = (RGPassManager*)PMS.top(); 24765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser else { 24865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 24965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser assert (!PMS.empty() && "Unable to create Region Pass Manager"); 25065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser PMDataManager *PMD = PMS.top(); 25165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 252f262e161612eb44b7bb3dd2008950be3e77b57ddHongbin Zheng // [1] Create new Region Pass Manager 2530e122d1c2422285c872f68fc0ae1f7e5d2739572Andrew Trick RGPM = new RGPassManager(); 25465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser RGPM->populateInheritedAnalysis(PMS); 25565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 25665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // [2] Set up new manager's top level manager 25765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser PMTopLevelManager *TPM = PMD->getTopLevelManager(); 25865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser TPM->addIndirectPassManager(RGPM); 25965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 26065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // [3] Assign manager to manage this new manager. This may create 26165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // and push new managers into PMS 262d713acb63105f55ef5ed0f3a499da81c3eeacd49Tobias Grosser TPM->schedulePass(RGPM); 26365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 26465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser // [4] Push new manager into PMS 26565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser PMS.push(RGPM); 26665513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser } 26765513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 26865513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser RGPM->add(this); 26965513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser} 27065513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser 27165513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser/// Get the printer pass 27265513605353c7e3ee8be6fc92892f257ad399d92Tobias GrosserPass *RegionPass::createPrinterPass(raw_ostream &O, 27365513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser const std::string &Banner) const { 27465513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser return new PrintRegionPass(Banner, O); 27565513605353c7e3ee8be6fc92892f257ad399d92Tobias Grosser} 276