1f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser//===- RegionInfo.cpp - SESE region detection analysis --------------------===//
2f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser//
3f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser//                     The LLVM Compiler Infrastructure
4f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser//
5f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// This file is distributed under the University of Illinois Open Source
6f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// License. See LICENSE.TXT for details.
7f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser//
8f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser//===----------------------------------------------------------------------===//
9f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// Detects single entry single exit regions in the control flow graph.
10f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser//===----------------------------------------------------------------------===//
11f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
12f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser#include "llvm/Analysis/RegionInfo.h"
13f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser#include "llvm/ADT/PostOrderIterator.h"
14f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser#include "llvm/ADT/Statistic.h"
15082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser#include "llvm/Analysis/LoopInfo.h"
16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Analysis/RegionIterator.h"
179fc5cdf77c812aaa80419036de27576d45894d0dChris Lattner#include "llvm/Assembly/Writer.h"
18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/CommandLine.h"
19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/ErrorHandling.h"
20f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
21f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser#define DEBUG_TYPE "region"
22f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser#include "llvm/Support/Debug.h"
23f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
24f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser#include <set>
25f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser#include <algorithm>
26f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
27f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosserusing namespace llvm;
28f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
29f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// Always verify if expensive checking is enabled.
30f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser#ifdef XDEBUG
31811edc1f1a0672d28cd7c938e478a92543e68a51Dan Gohmanstatic bool VerifyRegionInfo = true;
32f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser#else
33811edc1f1a0672d28cd7c938e478a92543e68a51Dan Gohmanstatic bool VerifyRegionInfo = false;
34f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser#endif
35f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
36f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosserstatic cl::opt<bool,true>
37f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserVerifyRegionInfoX("verify-region-info", cl::location(VerifyRegionInfo),
38f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser                cl::desc("Verify region info (time consuming)"));
39f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
40f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserSTATISTIC(numRegions,       "The # of regions");
41f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserSTATISTIC(numSimpleRegions, "The # of simple regions");
42f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
43cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosserstatic cl::opt<enum Region::PrintStyle> printStyle("print-region-style",
44cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser  cl::Hidden,
45f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  cl::desc("style of printing regions"),
46f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  cl::values(
47cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser    clEnumValN(Region::PrintNone, "none",  "print no details"),
48cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser    clEnumValN(Region::PrintBB, "bb",
4923a22a29441b8b7d948e6ff7c2afb39e6528cfbdHongbin Zheng               "print regions in detail with block_iterator"),
50cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser    clEnumValN(Region::PrintRN, "rn",
51cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser               "print regions in detail with element_iterator"),
52f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    clEnumValEnd));
53f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser//===----------------------------------------------------------------------===//
54f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser/// Region Implementation
55f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegion::Region(BasicBlock *Entry, BasicBlock *Exit, RegionInfo* RInfo,
56f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser               DominatorTree *dt, Region *Parent)
57f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser               : RegionNode(Parent, Entry, 1), RI(RInfo), DT(dt), exit(Exit) {}
58f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
59f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegion::~Region() {
60329878f4ddd72c6f2d2d6acfa48d7e1447ed88c0Daniel Dunbar  // Free the cached nodes.
61329878f4ddd72c6f2d2d6acfa48d7e1447ed88c0Daniel Dunbar  for (BBNodeMapT::iterator it = BBNodeMap.begin(),
62329878f4ddd72c6f2d2d6acfa48d7e1447ed88c0Daniel Dunbar         ie = BBNodeMap.end(); it != ie; ++it)
63329878f4ddd72c6f2d2d6acfa48d7e1447ed88c0Daniel Dunbar    delete it->second;
64329878f4ddd72c6f2d2d6acfa48d7e1447ed88c0Daniel Dunbar
65f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // Only clean the cache for this Region. Caches of child Regions will be
66f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // cleaned when the child Regions are deleted.
67f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BBNodeMap.clear();
68f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
69f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  for (iterator I = begin(), E = end(); I != E; ++I)
70f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    delete *I;
71f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
72f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
734bcc0228dcc90385e90f22cef38b2614d3aa3cd1Tobias Grosservoid Region::replaceEntry(BasicBlock *BB) {
744bcc0228dcc90385e90f22cef38b2614d3aa3cd1Tobias Grosser  entry.setPointer(BB);
754bcc0228dcc90385e90f22cef38b2614d3aa3cd1Tobias Grosser}
764bcc0228dcc90385e90f22cef38b2614d3aa3cd1Tobias Grosser
774bcc0228dcc90385e90f22cef38b2614d3aa3cd1Tobias Grosservoid Region::replaceExit(BasicBlock *BB) {
784bcc0228dcc90385e90f22cef38b2614d3aa3cd1Tobias Grosser  assert(exit && "No exit to replace!");
794bcc0228dcc90385e90f22cef38b2614d3aa3cd1Tobias Grosser  exit = BB;
804bcc0228dcc90385e90f22cef38b2614d3aa3cd1Tobias Grosser}
814bcc0228dcc90385e90f22cef38b2614d3aa3cd1Tobias Grosser
82d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosservoid Region::replaceEntryRecursive(BasicBlock *NewEntry) {
83d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser  std::vector<Region *> RegionQueue;
84d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser  BasicBlock *OldEntry = getEntry();
85d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser
86d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser  RegionQueue.push_back(this);
87d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser  while (!RegionQueue.empty()) {
88d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser    Region *R = RegionQueue.back();
89d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser    RegionQueue.pop_back();
90d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser
91d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser    R->replaceEntry(NewEntry);
92d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser    for (Region::const_iterator RI = R->begin(), RE = R->end(); RI != RE; ++RI)
93d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser      if ((*RI)->getEntry() == OldEntry)
94d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser        RegionQueue.push_back(*RI);
95d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser  }
96d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser}
97d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser
98d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosservoid Region::replaceExitRecursive(BasicBlock *NewExit) {
99d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser  std::vector<Region *> RegionQueue;
100d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser  BasicBlock *OldExit = getExit();
101d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser
102d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser  RegionQueue.push_back(this);
103d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser  while (!RegionQueue.empty()) {
104d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser    Region *R = RegionQueue.back();
105d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser    RegionQueue.pop_back();
106d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser
107d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser    R->replaceExit(NewExit);
108d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser    for (Region::const_iterator RI = R->begin(), RE = R->end(); RI != RE; ++RI)
109d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser      if ((*RI)->getExit() == OldExit)
110d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser        RegionQueue.push_back(*RI);
111d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser  }
112d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser}
113d03fdfb97c1a693101bfef5800c262237f5d382fTobias Grosser
114f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosserbool Region::contains(const BasicBlock *B) const {
115f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BasicBlock *BB = const_cast<BasicBlock*>(B);
116f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
117333403abbda5722724025cda1f8f52ef36d31505Tobias Grosser  if (!DT->getNode(BB))
118333403abbda5722724025cda1f8f52ef36d31505Tobias Grosser    return false;
119f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
120f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BasicBlock *entry = getEntry(), *exit = getExit();
121f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
122f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // Toplevel region.
123f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (!exit)
124f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    return true;
125f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
126f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return (DT->dominates(entry, BB)
127f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    && !(DT->dominates(exit, BB) && DT->dominates(entry, exit)));
128f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
129f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
130082d587d35a41ee06985d7867b72fb2632962281Tobias Grosserbool Region::contains(const Loop *L) const {
131082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  // BBs that are not part of any loop are element of the Loop
132082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  // described by the NULL pointer. This loop is not part of any region,
133082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  // except if the region describes the whole function.
134082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  if (L == 0)
135082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser    return getExit() == 0;
136082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser
137082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  if (!contains(L->getHeader()))
138082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser    return false;
139082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser
140082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  SmallVector<BasicBlock *, 8> ExitingBlocks;
141082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  L->getExitingBlocks(ExitingBlocks);
142082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser
143082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  for (SmallVectorImpl<BasicBlock*>::iterator BI = ExitingBlocks.begin(),
144082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser       BE = ExitingBlocks.end(); BI != BE; ++BI)
145082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser    if (!contains(*BI))
146082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser      return false;
147082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser
148082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  return true;
149082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser}
150082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser
151082d587d35a41ee06985d7867b72fb2632962281Tobias GrosserLoop *Region::outermostLoopInRegion(Loop *L) const {
152082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  if (!contains(L))
153082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser    return 0;
154082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser
155082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  while (L && contains(L->getParentLoop())) {
156082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser    L = L->getParentLoop();
157082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  }
158082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser
159082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  return L;
160082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser}
161082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser
162082d587d35a41ee06985d7867b72fb2632962281Tobias GrosserLoop *Region::outermostLoopInRegion(LoopInfo *LI, BasicBlock* BB) const {
163082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  assert(LI && BB && "LI and BB cannot be null!");
164082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  Loop *L = LI->getLoopFor(BB);
165082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  return outermostLoopInRegion(L);
166082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser}
167082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser
16821d842c35326281798f685661b88dedcd09c13aaTobias GrosserBasicBlock *Region::getEnteringBlock() const {
16921d842c35326281798f685661b88dedcd09c13aaTobias Grosser  BasicBlock *entry = getEntry();
17021d842c35326281798f685661b88dedcd09c13aaTobias Grosser  BasicBlock *Pred;
17121d842c35326281798f685661b88dedcd09c13aaTobias Grosser  BasicBlock *enteringBlock = 0;
172f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
173f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  for (pred_iterator PI = pred_begin(entry), PE = pred_end(entry); PI != PE;
17473362c820bad20e545d37b8a2414c35c0d3d583cTobias Grosser       ++PI) {
17521d842c35326281798f685661b88dedcd09c13aaTobias Grosser    Pred = *PI;
17673362c820bad20e545d37b8a2414c35c0d3d583cTobias Grosser    if (DT->getNode(Pred) && !contains(Pred)) {
17721d842c35326281798f685661b88dedcd09c13aaTobias Grosser      if (enteringBlock)
17821d842c35326281798f685661b88dedcd09c13aaTobias Grosser        return 0;
17921d842c35326281798f685661b88dedcd09c13aaTobias Grosser
18021d842c35326281798f685661b88dedcd09c13aaTobias Grosser      enteringBlock = Pred;
181f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    }
18273362c820bad20e545d37b8a2414c35c0d3d583cTobias Grosser  }
183f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
18421d842c35326281798f685661b88dedcd09c13aaTobias Grosser  return enteringBlock;
18521d842c35326281798f685661b88dedcd09c13aaTobias Grosser}
18621d842c35326281798f685661b88dedcd09c13aaTobias Grosser
18721d842c35326281798f685661b88dedcd09c13aaTobias GrosserBasicBlock *Region::getExitingBlock() const {
18821d842c35326281798f685661b88dedcd09c13aaTobias Grosser  BasicBlock *exit = getExit();
18921d842c35326281798f685661b88dedcd09c13aaTobias Grosser  BasicBlock *Pred;
19021d842c35326281798f685661b88dedcd09c13aaTobias Grosser  BasicBlock *exitingBlock = 0;
19121d842c35326281798f685661b88dedcd09c13aaTobias Grosser
19221d842c35326281798f685661b88dedcd09c13aaTobias Grosser  if (!exit)
19321d842c35326281798f685661b88dedcd09c13aaTobias Grosser    return 0;
194f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
195f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  for (pred_iterator PI = pred_begin(exit), PE = pred_end(exit); PI != PE;
19621d842c35326281798f685661b88dedcd09c13aaTobias Grosser       ++PI) {
19721d842c35326281798f685661b88dedcd09c13aaTobias Grosser    Pred = *PI;
19821d842c35326281798f685661b88dedcd09c13aaTobias Grosser    if (contains(Pred)) {
19921d842c35326281798f685661b88dedcd09c13aaTobias Grosser      if (exitingBlock)
20021d842c35326281798f685661b88dedcd09c13aaTobias Grosser        return 0;
20121d842c35326281798f685661b88dedcd09c13aaTobias Grosser
20221d842c35326281798f685661b88dedcd09c13aaTobias Grosser      exitingBlock = Pred;
203f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    }
20421d842c35326281798f685661b88dedcd09c13aaTobias Grosser  }
20521d842c35326281798f685661b88dedcd09c13aaTobias Grosser
20621d842c35326281798f685661b88dedcd09c13aaTobias Grosser  return exitingBlock;
20721d842c35326281798f685661b88dedcd09c13aaTobias Grosser}
208f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
20921d842c35326281798f685661b88dedcd09c13aaTobias Grosserbool Region::isSimple() const {
21021d842c35326281798f685661b88dedcd09c13aaTobias Grosser  return !isTopLevelRegion() && getEnteringBlock() && getExitingBlock();
211f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
212f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
213082d587d35a41ee06985d7867b72fb2632962281Tobias Grosserstd::string Region::getNameStr() const {
214082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  std::string exitName;
215082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  std::string entryName;
216082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser
217082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  if (getEntry()->getName().empty()) {
218082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser    raw_string_ostream OS(entryName);
219082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser
220082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser    WriteAsOperand(OS, getEntry(), false);
221082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  } else
2222774dc085d36c2097e080e2e0ea46a7e49be37afBenjamin Kramer    entryName = getEntry()->getName();
223082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser
224082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  if (getExit()) {
225082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser    if (getExit()->getName().empty()) {
226082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser      raw_string_ostream OS(exitName);
227082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser
228082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser      WriteAsOperand(OS, getExit(), false);
229082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser    } else
2302774dc085d36c2097e080e2e0ea46a7e49be37afBenjamin Kramer      exitName = getExit()->getName();
231082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  } else
232082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser    exitName = "<Function Return>";
233082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser
234082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser  return entryName + " => " + exitName;
235082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser}
236082d587d35a41ee06985d7867b72fb2632962281Tobias Grosser
237f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid Region::verifyBBInRegion(BasicBlock *BB) const {
238f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (!contains(BB))
239f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    llvm_unreachable("Broken region found!");
240f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
241f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BasicBlock *entry = getEntry(), *exit = getExit();
242f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
243f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  for (succ_iterator SI = succ_begin(BB), SE = succ_end(BB); SI != SE; ++SI)
244f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    if (!contains(*SI) && exit != *SI)
245f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      llvm_unreachable("Broken region found!");
246f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
247f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (entry != BB)
248f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    for (pred_iterator SI = pred_begin(BB), SE = pred_end(BB); SI != SE; ++SI)
249f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      if (!contains(*SI))
250f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser        llvm_unreachable("Broken region found!");
251f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
252f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
253f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid Region::verifyWalk(BasicBlock *BB, std::set<BasicBlock*> *visited) const {
254f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BasicBlock *exit = getExit();
255f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
256f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  visited->insert(BB);
257f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
258f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  verifyBBInRegion(BB);
259f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
260f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  for (succ_iterator SI = succ_begin(BB), SE = succ_end(BB); SI != SE; ++SI)
261f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    if (*SI != exit && visited->find(*SI) == visited->end())
262f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser        verifyWalk(*SI, visited);
263f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
264f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
265f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid Region::verifyRegion() const {
266f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // Only do verification when user wants to, otherwise this expensive
267f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // check will be invoked by PassManager.
268f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (!VerifyRegionInfo) return;
269f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
270f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  std::set<BasicBlock*> visited;
271f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  verifyWalk(getEntry(), &visited);
272f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
273f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
274f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid Region::verifyRegionNest() const {
275f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  for (Region::const_iterator RI = begin(), RE = end(); RI != RE; ++RI)
276f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    (*RI)->verifyRegionNest();
277f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
278f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  verifyRegion();
279f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
280f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
281f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegion::element_iterator Region::element_begin() {
282f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return GraphTraits<Region*>::nodes_begin(this);
283f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
284f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
285f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegion::element_iterator Region::element_end() {
286f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return GraphTraits<Region*>::nodes_end(this);
287f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
288f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
289f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegion::const_element_iterator Region::element_begin() const {
290f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return GraphTraits<const Region*>::nodes_begin(this);
291f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
292f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
293f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegion::const_element_iterator Region::element_end() const {
294f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return GraphTraits<const Region*>::nodes_end(this);
295f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
296f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
297f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegion* Region::getSubRegionNode(BasicBlock *BB) const {
298f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  Region *R = RI->getRegionFor(BB);
299f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
300f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (!R || R == this)
301f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    return 0;
302f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
303f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // If we pass the BB out of this region, that means our code is broken.
304f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  assert(contains(R) && "BB not in current region!");
305f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
306f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  while (contains(R->getParent()) && R->getParent() != this)
307f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    R = R->getParent();
308f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
309f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (R->getEntry() != BB)
310f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    return 0;
311f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
312f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return R;
313f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
314f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
315f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegionNode* Region::getBBNode(BasicBlock *BB) const {
316f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  assert(contains(BB) && "Can get BB node out of this region!");
317f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
318f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BBNodeMapT::const_iterator at = BBNodeMap.find(BB);
319f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
320f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (at != BBNodeMap.end())
321f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    return at->second;
322f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
323f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  RegionNode *NewNode = new RegionNode(const_cast<Region*>(this), BB);
324f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BBNodeMap.insert(std::make_pair(BB, NewNode));
325f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return NewNode;
326f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
327f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
328f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegionNode* Region::getNode(BasicBlock *BB) const {
329f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  assert(contains(BB) && "Can get BB node out of this region!");
330f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (Region* Child = getSubRegionNode(BB))
331f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    return Child->getNode();
332f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
333f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return getBBNode(BB);
334f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
335f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
336f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid Region::transferChildrenTo(Region *To) {
337f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  for (iterator I = begin(), E = end(); I != E; ++I) {
338f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    (*I)->parent = To;
339f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    To->children.push_back(*I);
340f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  }
341f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  children.clear();
342f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
343f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
3449649390e1fcb6d42e228364230f16409ad150fefTobias Grosservoid Region::addSubRegion(Region *SubRegion, bool moveChildren) {
345f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  assert(SubRegion->parent == 0 && "SubRegion already has a parent!");
3469649390e1fcb6d42e228364230f16409ad150fefTobias Grosser  assert(std::find(begin(), end(), SubRegion) == children.end()
3479649390e1fcb6d42e228364230f16409ad150fefTobias Grosser         && "Subregion already exists!");
3489649390e1fcb6d42e228364230f16409ad150fefTobias Grosser
349f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  SubRegion->parent = this;
350f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  children.push_back(SubRegion);
3519649390e1fcb6d42e228364230f16409ad150fefTobias Grosser
3529649390e1fcb6d42e228364230f16409ad150fefTobias Grosser  if (!moveChildren)
3539649390e1fcb6d42e228364230f16409ad150fefTobias Grosser    return;
3549649390e1fcb6d42e228364230f16409ad150fefTobias Grosser
3559649390e1fcb6d42e228364230f16409ad150fefTobias Grosser  assert(SubRegion->children.size() == 0
3569649390e1fcb6d42e228364230f16409ad150fefTobias Grosser         && "SubRegions that contain children are not supported");
3579649390e1fcb6d42e228364230f16409ad150fefTobias Grosser
3589649390e1fcb6d42e228364230f16409ad150fefTobias Grosser  for (element_iterator I = element_begin(), E = element_end(); I != E; ++I)
3599649390e1fcb6d42e228364230f16409ad150fefTobias Grosser    if (!(*I)->isSubRegion()) {
3609649390e1fcb6d42e228364230f16409ad150fefTobias Grosser      BasicBlock *BB = (*I)->getNodeAs<BasicBlock>();
3619649390e1fcb6d42e228364230f16409ad150fefTobias Grosser
3629649390e1fcb6d42e228364230f16409ad150fefTobias Grosser      if (SubRegion->contains(BB))
3639649390e1fcb6d42e228364230f16409ad150fefTobias Grosser        RI->setRegionFor(BB, SubRegion);
3649649390e1fcb6d42e228364230f16409ad150fefTobias Grosser    }
3659649390e1fcb6d42e228364230f16409ad150fefTobias Grosser
3669649390e1fcb6d42e228364230f16409ad150fefTobias Grosser  std::vector<Region*> Keep;
3679649390e1fcb6d42e228364230f16409ad150fefTobias Grosser  for (iterator I = begin(), E = end(); I != E; ++I)
3689649390e1fcb6d42e228364230f16409ad150fefTobias Grosser    if (SubRegion->contains(*I) && *I != SubRegion) {
3699649390e1fcb6d42e228364230f16409ad150fefTobias Grosser      SubRegion->children.push_back(*I);
3709649390e1fcb6d42e228364230f16409ad150fefTobias Grosser      (*I)->parent = SubRegion;
3719649390e1fcb6d42e228364230f16409ad150fefTobias Grosser    } else
3729649390e1fcb6d42e228364230f16409ad150fefTobias Grosser      Keep.push_back(*I);
3739649390e1fcb6d42e228364230f16409ad150fefTobias Grosser
3749649390e1fcb6d42e228364230f16409ad150fefTobias Grosser  children.clear();
3759649390e1fcb6d42e228364230f16409ad150fefTobias Grosser  children.insert(children.begin(), Keep.begin(), Keep.end());
376f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
377f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
378f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
379f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegion *Region::removeSubRegion(Region *Child) {
380f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  assert(Child->parent == this && "Child is not a child of this region!");
381f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  Child->parent = 0;
382f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  RegionSet::iterator I = std::find(children.begin(), children.end(), Child);
383f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  assert(I != children.end() && "Region does not exit. Unable to remove.");
384f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  children.erase(children.begin()+(I-begin()));
385f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return Child;
386f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
387f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
388f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosserunsigned Region::getDepth() const {
389f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  unsigned Depth = 0;
390f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
391f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  for (Region *R = parent; R != 0; R = R->parent)
392f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    ++Depth;
393f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
394f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return Depth;
395f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
396f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
397c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias GrosserRegion *Region::getExpandedRegion() const {
398c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser  unsigned NumSuccessors = exit->getTerminator()->getNumSuccessors();
399c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser
400c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser  if (NumSuccessors == 0)
401c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser    return NULL;
402c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser
403c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser  for (pred_iterator PI = pred_begin(getExit()), PE = pred_end(getExit());
404c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser       PI != PE; ++PI)
405c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser    if (!DT->dominates(getEntry(), *PI))
406c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser      return NULL;
407c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser
408c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser  Region *R = RI->getRegionFor(exit);
409c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser
410c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser  if (R->getEntry() != exit) {
411c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser    if (exit->getTerminator()->getNumSuccessors() == 1)
412c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser      return new Region(getEntry(), *succ_begin(exit), RI, DT);
413c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser    else
414c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser      return NULL;
415c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser  }
416c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser
417c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser  while (R->getParent() && R->getParent()->getEntry() == exit)
418c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser    R = R->getParent();
419c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser
420c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser  if (!DT->dominates(getEntry(), R->getExit()))
421c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser    for (pred_iterator PI = pred_begin(getExit()), PE = pred_end(getExit());
422c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser         PI != PE; ++PI)
423c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser    if (!DT->dominates(R->getExit(), *PI))
424c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser      return NULL;
425c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser
426c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser  return new Region(getEntry(), R->getExit(), RI, DT);
427c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser}
428c69bd733c02a4e0ca25f7a2d6b9b05168720d373Tobias Grosser
429cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosservoid Region::print(raw_ostream &OS, bool print_tree, unsigned level,
430cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser                   enum PrintStyle Style) const {
431f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (print_tree)
432f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    OS.indent(level*2) << "[" << level << "] " << getNameStr();
433f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  else
434f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    OS.indent(level*2) << getNameStr();
435f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
436f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  OS << "\n";
437f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
438f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
439cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser  if (Style != PrintNone) {
440f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    OS.indent(level*2) << "{\n";
441f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    OS.indent(level*2 + 2);
442f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
443cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser    if (Style == PrintBB) {
44423a22a29441b8b7d948e6ff7c2afb39e6528cfbdHongbin Zheng      for (const_block_iterator I = block_begin(), E = block_end(); I != E; ++I)
44523a22a29441b8b7d948e6ff7c2afb39e6528cfbdHongbin Zheng        OS << (*I)->getName() << ", "; // TODO: remove the last ","
446cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser    } else if (Style == PrintRN) {
447f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      for (const_element_iterator I = element_begin(), E = element_end(); I!=E; ++I)
448f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser        OS << **I << ", "; // TODO: remove the last ",
449f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    }
450f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
451f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    OS << "\n";
452f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  }
453f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
454f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (print_tree)
455f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    for (const_iterator RI = begin(), RE = end(); RI != RE; ++RI)
456cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser      (*RI)->print(OS, print_tree, level+1, Style);
457f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
458cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser  if (Style != PrintNone)
459f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    OS.indent(level*2) << "} \n";
460f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
461f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
462286c4dc355b8be6806081b23c3097485821c7642Manman Ren#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
463f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid Region::dump() const {
464cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser  print(dbgs(), true, getDepth(), printStyle.getValue());
465f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
466cc77eece74c8db09acc2af425e7e6c88a5bb30d1Manman Ren#endif
467f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
468f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid Region::clearNodeCache() {
46967be08a2f186d8262781f0d1ef67cab3cd2a0d2bTobias Grosser  // Free the cached nodes.
47067be08a2f186d8262781f0d1ef67cab3cd2a0d2bTobias Grosser  for (BBNodeMapT::iterator I = BBNodeMap.begin(),
471c502101000b53eca25ef45068f57669d12d617bfTobias Grosser       IE = BBNodeMap.end(); I != IE; ++I)
47267be08a2f186d8262781f0d1ef67cab3cd2a0d2bTobias Grosser    delete I->second;
47367be08a2f186d8262781f0d1ef67cab3cd2a0d2bTobias Grosser
474f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BBNodeMap.clear();
475f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  for (Region::iterator RI = begin(), RE = end(); RI != RE; ++RI)
476f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    (*RI)->clearNodeCache();
477f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
478f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
479f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser//===----------------------------------------------------------------------===//
480f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// RegionInfo implementation
481f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser//
482f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
483f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosserbool RegionInfo::isCommonDomFrontier(BasicBlock *BB, BasicBlock *entry,
484f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser                                     BasicBlock *exit) const {
4853d8586eb6384f22984e8c519ea9742eac68c9724Gabor Greif  for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE; ++PI) {
4863d8586eb6384f22984e8c519ea9742eac68c9724Gabor Greif    BasicBlock *P = *PI;
4873d8586eb6384f22984e8c519ea9742eac68c9724Gabor Greif    if (DT->dominates(entry, P) && !DT->dominates(exit, P))
488f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      return false;
4893d8586eb6384f22984e8c519ea9742eac68c9724Gabor Greif  }
490f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return true;
491f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
492f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
493f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosserbool RegionInfo::isRegion(BasicBlock *entry, BasicBlock *exit) const {
494f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  assert(entry && exit && "entry and exit must not be null!");
495f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  typedef DominanceFrontier::DomSetType DST;
496f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
49711aa60d05ac3a26a547022f574fa09dfeec2e0ccGabor Greif  DST *entrySuccs = &DF->find(entry)->second;
498f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
499f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // Exit is the header of a loop that contains the entry. In this case,
500f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // the dominance frontier must only contain the exit.
501f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (!DT->dominates(entry, exit)) {
502f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    for (DST::iterator SI = entrySuccs->begin(), SE = entrySuccs->end();
503f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser         SI != SE; ++SI)
504f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      if (*SI != exit && *SI != entry)
505f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser        return false;
506f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
507f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    return true;
508f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  }
509f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
51011aa60d05ac3a26a547022f574fa09dfeec2e0ccGabor Greif  DST *exitSuccs = &DF->find(exit)->second;
511f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
512f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // Do not allow edges leaving the region.
513f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  for (DST::iterator SI = entrySuccs->begin(), SE = entrySuccs->end();
514f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser       SI != SE; ++SI) {
515f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    if (*SI == exit || *SI == entry)
516f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      continue;
517f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    if (exitSuccs->find(*SI) == exitSuccs->end())
518f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      return false;
519f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    if (!isCommonDomFrontier(*SI, entry, exit))
520f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      return false;
521f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  }
522f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
523f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // Do not allow edges pointing into the region.
524f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  for (DST::iterator SI = exitSuccs->begin(), SE = exitSuccs->end();
525f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser       SI != SE; ++SI)
526a29dbd2dcc04c8d07dd9e1e49b4e54debbc23996Dan Gohman    if (DT->properlyDominates(entry, *SI) && *SI != exit)
527f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      return false;
528f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
529f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
530f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return true;
531f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
532f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
533f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid RegionInfo::insertShortCut(BasicBlock *entry, BasicBlock *exit,
534f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser                             BBtoBBMap *ShortCut) const {
535f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  assert(entry && exit && "entry and exit must not be null!");
536f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
537f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BBtoBBMap::iterator e = ShortCut->find(exit);
538f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
539f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (e == ShortCut->end())
540f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    // No further region at exit available.
541f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    (*ShortCut)[entry] = exit;
542f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  else {
543f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    // We found a region e that starts at exit. Therefore (entry, e->second)
544f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    // is also a region, that is larger than (entry, exit). Insert the
545f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    // larger one.
546f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    BasicBlock *BB = e->second;
547f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    (*ShortCut)[entry] = BB;
548f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  }
549f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
550f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
551f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserDomTreeNode* RegionInfo::getNextPostDom(DomTreeNode* N,
552f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser                                        BBtoBBMap *ShortCut) const {
553f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BBtoBBMap::iterator e = ShortCut->find(N->getBlock());
554f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
555f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (e == ShortCut->end())
556f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    return N->getIDom();
557f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
558f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return PDT->getNode(e->second)->getIDom();
559f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
560f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
561f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosserbool RegionInfo::isTrivialRegion(BasicBlock *entry, BasicBlock *exit) const {
562f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  assert(entry && exit && "entry and exit must not be null!");
563f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
564f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  unsigned num_successors = succ_end(entry) - succ_begin(entry);
565f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
566f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (num_successors <= 1 && exit == *(succ_begin(entry)))
567f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    return true;
568f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
569f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return false;
570f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
571f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
572f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid RegionInfo::updateStatistics(Region *R) {
573f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  ++numRegions;
574f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
575f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // TODO: Slow. Should only be enabled if -stats is used.
576f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (R->isSimple()) ++numSimpleRegions;
577f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
578f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
579f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegion *RegionInfo::createRegion(BasicBlock *entry, BasicBlock *exit) {
580f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  assert(entry && exit && "entry and exit must not be null!");
581f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
582f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (isTrivialRegion(entry, exit))
583f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    return 0;
584f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
585f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  Region *region = new Region(entry, exit, this, DT);
586f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BBtoRegion.insert(std::make_pair(entry, region));
587f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
588f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser #ifdef XDEBUG
589f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    region->verifyRegion();
590f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser #else
591f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    DEBUG(region->verifyRegion());
592f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser #endif
593f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
594f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  updateStatistics(region);
595f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return region;
596f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
597f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
598f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid RegionInfo::findRegionsWithEntry(BasicBlock *entry, BBtoBBMap *ShortCut) {
599f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  assert(entry);
600f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
601f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  DomTreeNode *N = PDT->getNode(entry);
602f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
603f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (!N)
604f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    return;
605f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
606f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  Region *lastRegion= 0;
607f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BasicBlock *lastExit = entry;
608f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
609f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // As only a BasicBlock that postdominates entry can finish a region, walk the
610f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // post dominance tree upwards.
611f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  while ((N = getNextPostDom(N, ShortCut))) {
612f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    BasicBlock *exit = N->getBlock();
613f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
614f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    if (!exit)
615f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      break;
616f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
617f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    if (isRegion(entry, exit)) {
618f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      Region *newRegion = createRegion(entry, exit);
619f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
620f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      if (lastRegion)
621f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser        newRegion->addSubRegion(lastRegion);
622f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
623f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      lastRegion = newRegion;
624f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      lastExit = exit;
625f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    }
626f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
627f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    // This can never be a region, so stop the search.
628f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    if (!DT->dominates(entry, exit))
629f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      break;
630f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  }
631f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
632f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // Tried to create regions from entry to lastExit.  Next time take a
633f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // shortcut from entry to lastExit.
634f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (lastExit != entry)
635f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    insertShortCut(entry, lastExit, ShortCut);
636f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
637f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
638f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid RegionInfo::scanForRegions(Function &F, BBtoBBMap *ShortCut) {
639f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BasicBlock *entry = &(F.getEntryBlock());
640f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  DomTreeNode *N = DT->getNode(entry);
641f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
642f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // Iterate over the dominance tree in post order to start with the small
643f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // regions from the bottom of the dominance tree.  If the small regions are
644f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // detected first, detection of bigger regions is faster, as we can jump
645f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // over the small regions.
646f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  for (po_iterator<DomTreeNode*> FI = po_begin(N), FE = po_end(N); FI != FE;
647f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    ++FI) {
648f95eef695d35cac832dfd1ff2b2e3081f7d0e24aGabor Greif    findRegionsWithEntry(FI->getBlock(), ShortCut);
649f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  }
650f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
651f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
652f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegion *RegionInfo::getTopMostParent(Region *region) {
653f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  while (region->parent)
654f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    region = region->getParent();
655f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
656f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return region;
657f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
658f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
659f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid RegionInfo::buildRegionsTree(DomTreeNode *N, Region *region) {
660f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BasicBlock *BB = N->getBlock();
661f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
662f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // Passed region exit
663f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  while (BB == region->getExit())
664f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    region = region->getParent();
665f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
666f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BBtoRegionMap::iterator it = BBtoRegion.find(BB);
667f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
668f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // This basic block is a start block of a region. It is already in the
669f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // BBtoRegion relation. Only the child basic blocks have to be updated.
670f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (it != BBtoRegion.end()) {
67190f20044ade3712c8b0c3f4ebe47d57ad15ae6ceChad Rosier    Region *newRegion = it->second;
672f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    region->addSubRegion(getTopMostParent(newRegion));
673f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    region = newRegion;
674f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  } else {
675f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    BBtoRegion[BB] = region;
676f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  }
677f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
678f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  for (DomTreeNode::iterator CI = N->begin(), CE = N->end(); CI != CE; ++CI)
679f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    buildRegionsTree(*CI, region);
680f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
681f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
682f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid RegionInfo::releaseMemory() {
683f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BBtoRegion.clear();
684f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (TopLevelRegion)
685f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    delete TopLevelRegion;
686f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  TopLevelRegion = 0;
687f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
688f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
68990c579de5a383cee278acc3f7e7b9d0a656e6a35Owen AndersonRegionInfo::RegionInfo() : FunctionPass(ID) {
690081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  initializeRegionInfoPass(*PassRegistry::getPassRegistry());
691f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  TopLevelRegion = 0;
692f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
693f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
694f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegionInfo::~RegionInfo() {
695f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  releaseMemory();
696f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
697f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
698f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid RegionInfo::Calculate(Function &F) {
699f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // ShortCut a function where for every BB the exit of the largest region
700f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // starting with BB is stored. These regions can be threated as single BBS.
701f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // This improves performance on linear CFGs.
702f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BBtoBBMap ShortCut;
703f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
704f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  scanForRegions(F, &ShortCut);
705f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BasicBlock *BB = &F.getEntryBlock();
706f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  buildRegionsTree(DT->getNode(BB), TopLevelRegion);
707f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
708f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
709f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosserbool RegionInfo::runOnFunction(Function &F) {
710f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  releaseMemory();
711f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
712f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  DT = &getAnalysis<DominatorTree>();
713f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  PDT = &getAnalysis<PostDominatorTree>();
714f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  DF = &getAnalysis<DominanceFrontier>();
715f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
716f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  TopLevelRegion = new Region(&F.getEntryBlock(), 0, this, DT, 0);
717f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  updateStatistics(TopLevelRegion);
718f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
719f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  Calculate(F);
720f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
721f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return false;
722f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
723f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
724f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid RegionInfo::getAnalysisUsage(AnalysisUsage &AU) const {
725f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  AU.setPreservesAll();
726f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  AU.addRequiredTransitive<DominatorTree>();
727f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  AU.addRequired<PostDominatorTree>();
728f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  AU.addRequired<DominanceFrontier>();
729f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
730f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
731f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid RegionInfo::print(raw_ostream &OS, const Module *) const {
732f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  OS << "Region tree:\n";
733cc5d992bc167ded99b039ed8fdde190a586a1562Tobias Grosser  TopLevelRegion->print(OS, true, 0, printStyle.getValue());
734f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  OS << "End region tree\n";
735f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
736f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
737f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosservoid RegionInfo::verifyAnalysis() const {
738f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // Only do verification when user wants to, otherwise this expensive check
739f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // will be invoked by PMDataManager::verifyPreservedAnalysis when
740f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  // a regionpass (marked PreservedAll) finish.
741f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (!VerifyRegionInfo) return;
742f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
743f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  TopLevelRegion->verifyRegionNest();
744f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
745f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
746f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// Region pass manager support.
747f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegion *RegionInfo::getRegionFor(BasicBlock *BB) const {
748f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BBtoRegionMap::const_iterator I=
749f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    BBtoRegion.find(BB);
750f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return I != BBtoRegion.end() ? I->second : 0;
751f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
752f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
7539ee5c5077690a4de31e22bb9e135deb6da3f68fbTobias Grosservoid RegionInfo::setRegionFor(BasicBlock *BB, Region *R) {
7549ee5c5077690a4de31e22bb9e135deb6da3f68fbTobias Grosser  BBtoRegion[BB] = R;
7559ee5c5077690a4de31e22bb9e135deb6da3f68fbTobias Grosser}
7569ee5c5077690a4de31e22bb9e135deb6da3f68fbTobias Grosser
757f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegion *RegionInfo::operator[](BasicBlock *BB) const {
758f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return getRegionFor(BB);
759f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
760f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
7610e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias GrosserBasicBlock *RegionInfo::getMaxRegionExit(BasicBlock *BB) const {
7620e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser  BasicBlock *Exit = NULL;
7630e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser
7640e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser  while (true) {
7650e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser    // Get largest region that starts at BB.
7660e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser    Region *R = getRegionFor(BB);
7670e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser    while (R && R->getParent() && R->getParent()->getEntry() == BB)
7680e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser      R = R->getParent();
7690e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser
7700e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser    // Get the single exit of BB.
7710e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser    if (R && R->getEntry() == BB)
7720e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser      Exit = R->getExit();
7730e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser    else if (++succ_begin(BB) == succ_end(BB))
7740e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser      Exit = *succ_begin(BB);
7750e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser    else // No single exit exists.
7760e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser      return Exit;
7770e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser
7780e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser    // Get largest region that starts at Exit.
7790e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser    Region *ExitR = getRegionFor(Exit);
7800e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser    while (ExitR && ExitR->getParent()
7810e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser           && ExitR->getParent()->getEntry() == Exit)
7820e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser      ExitR = ExitR->getParent();
7830e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser
7840e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser    for (pred_iterator PI = pred_begin(Exit), PE = pred_end(Exit); PI != PE;
7850e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser         ++PI)
7860e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser      if (!R->contains(*PI) && !ExitR->contains(*PI))
7870e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser        break;
7880e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser
7890e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser    // This stops infinite cycles.
7900e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser    if (DT->dominates(Exit, BB))
7910e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser      break;
7920e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser
7930e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser    BB = Exit;
7940e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser  }
7950e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser
7960e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser  return Exit;
7970e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser}
7980e6fcf4be360f5d73685c213e3b4af1bb9ce2b5dTobias Grosser
799f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegion*
800f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegionInfo::getCommonRegion(Region *A, Region *B) const {
801f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  assert (A && B && "One of the Regions is NULL");
802f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
803f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  if (A->contains(B)) return A;
804f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
805f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  while (!B->contains(A))
806f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    B = B->getParent();
807f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
808f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return B;
809f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
810f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
811f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegion*
812f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegionInfo::getCommonRegion(SmallVectorImpl<Region*> &Regions) const {
813f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  Region* ret = Regions.back();
814f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  Regions.pop_back();
815f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
816f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  for (SmallVectorImpl<Region*>::const_iterator I = Regions.begin(),
817f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser       E = Regions.end(); I != E; ++I)
818f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      ret = getCommonRegion(ret, *I);
819f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
820f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return ret;
821f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
822f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
823f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegion*
824f96b0063674e6bf72da5429bd49097e33c2325c7Tobias GrosserRegionInfo::getCommonRegion(SmallVectorImpl<BasicBlock*> &BBs) const {
825f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  Region* ret = getRegionFor(BBs.back());
826f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  BBs.pop_back();
827f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
828f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  for (SmallVectorImpl<BasicBlock*>::const_iterator I = BBs.begin(),
829f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser       E = BBs.end(); I != E; ++I)
830f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser      ret = getCommonRegion(ret, getRegionFor(*I));
831f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
832f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  return ret;
833f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
834f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
835592316c4198023431799f8e597860b31ea7116c9Tobias Grosservoid RegionInfo::splitBlock(BasicBlock* NewBB, BasicBlock *OldBB)
836592316c4198023431799f8e597860b31ea7116c9Tobias Grosser{
837592316c4198023431799f8e597860b31ea7116c9Tobias Grosser  Region *R = getRegionFor(OldBB);
838b227930cd6850e4c47358e671dbe2cdacb430defTobias Grosser
839592316c4198023431799f8e597860b31ea7116c9Tobias Grosser  setRegionFor(NewBB, R);
840592316c4198023431799f8e597860b31ea7116c9Tobias Grosser
841b227930cd6850e4c47358e671dbe2cdacb430defTobias Grosser  while (R->getEntry() == OldBB && !R->isTopLevelRegion()) {
842592316c4198023431799f8e597860b31ea7116c9Tobias Grosser    R->replaceEntry(NewBB);
843592316c4198023431799f8e597860b31ea7116c9Tobias Grosser    R = R->getParent();
844592316c4198023431799f8e597860b31ea7116c9Tobias Grosser  }
845592316c4198023431799f8e597860b31ea7116c9Tobias Grosser
846592316c4198023431799f8e597860b31ea7116c9Tobias Grosser  setRegionFor(OldBB, R);
847592316c4198023431799f8e597860b31ea7116c9Tobias Grosser}
848592316c4198023431799f8e597860b31ea7116c9Tobias Grosser
849f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosserchar RegionInfo::ID = 0;
8502ab36d350293c77fc8941ce1023e4899df7e3a82Owen AndersonINITIALIZE_PASS_BEGIN(RegionInfo, "regions",
8512ab36d350293c77fc8941ce1023e4899df7e3a82Owen Anderson                "Detect single entry single exit regions", true, true)
8522ab36d350293c77fc8941ce1023e4899df7e3a82Owen AndersonINITIALIZE_PASS_DEPENDENCY(DominatorTree)
8532ab36d350293c77fc8941ce1023e4899df7e3a82Owen AndersonINITIALIZE_PASS_DEPENDENCY(PostDominatorTree)
8542ab36d350293c77fc8941ce1023e4899df7e3a82Owen AndersonINITIALIZE_PASS_DEPENDENCY(DominanceFrontier)
8552ab36d350293c77fc8941ce1023e4899df7e3a82Owen AndersonINITIALIZE_PASS_END(RegionInfo, "regions",
856ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                "Detect single entry single exit regions", true, true)
857f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
858f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// Create methods available outside of this file, to use them
859f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
860f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser// the link time optimization.
861f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
862f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grossernamespace llvm {
863f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  FunctionPass *createRegionInfoPass() {
864f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser    return new RegionInfo();
865f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser  }
866f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser}
867f96b0063674e6bf72da5429bd49097e33c2325c7Tobias Grosser
868