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