1 //===- RegionInfo.cpp - SESE region detection analysis --------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
9 // Detects single entry single exit regions in the control flow graph.
10 //===----------------------------------------------------------------------===//
12 #include "llvm/Analysis/RegionInfo.h"
13 #include "llvm/Analysis/RegionIterator.h"
15 #include "llvm/ADT/PostOrderIterator.h"
16 #include "llvm/ADT/Statistic.h"
17 #include "llvm/Support/CommandLine.h"
18 #include "llvm/Support/ErrorHandling.h"
19 #include "llvm/Analysis/LoopInfo.h"
20 #include "llvm/Assembly/Writer.h"
22 #define DEBUG_TYPE "region"
23 #include "llvm/Support/Debug.h"
30 // Always verify if expensive checking is enabled.
32 static bool VerifyRegionInfo
= true;
34 static bool VerifyRegionInfo
= false;
37 static cl::opt
<bool,true>
38 VerifyRegionInfoX("verify-region-info", cl::location(VerifyRegionInfo
),
39 cl::desc("Verify region info (time consuming)"));
41 STATISTIC(numRegions
, "The # of regions");
42 STATISTIC(numSimpleRegions
, "The # of simple regions");
44 static cl::opt
<enum Region::PrintStyle
> printStyle("print-region-style",
46 cl::desc("style of printing regions"),
48 clEnumValN(Region::PrintNone
, "none", "print no details"),
49 clEnumValN(Region::PrintBB
, "bb",
50 "print regions in detail with block_iterator"),
51 clEnumValN(Region::PrintRN
, "rn",
52 "print regions in detail with element_iterator"),
54 //===----------------------------------------------------------------------===//
55 /// Region Implementation
56 Region::Region(BasicBlock
*Entry
, BasicBlock
*Exit
, RegionInfo
* RInfo
,
57 DominatorTree
*dt
, Region
*Parent
)
58 : RegionNode(Parent
, Entry
, 1), RI(RInfo
), DT(dt
), exit(Exit
) {}
61 // Free the cached nodes.
62 for (BBNodeMapT::iterator it
= BBNodeMap
.begin(),
63 ie
= BBNodeMap
.end(); it
!= ie
; ++it
)
66 // Only clean the cache for this Region. Caches of child Regions will be
67 // cleaned when the child Regions are deleted.
70 for (iterator I
= begin(), E
= end(); I
!= E
; ++I
)
74 void Region::replaceEntry(BasicBlock
*BB
) {
78 void Region::replaceExit(BasicBlock
*BB
) {
79 assert(exit
&& "No exit to replace!");
83 bool Region::contains(const BasicBlock
*B
) const {
84 BasicBlock
*BB
= const_cast<BasicBlock
*>(B
);
86 assert(DT
->getNode(BB
) && "BB not part of the dominance tree");
88 BasicBlock
*entry
= getEntry(), *exit
= getExit();
94 return (DT
->dominates(entry
, BB
)
95 && !(DT
->dominates(exit
, BB
) && DT
->dominates(entry
, exit
)));
98 bool Region::contains(const Loop
*L
) const {
99 // BBs that are not part of any loop are element of the Loop
100 // described by the NULL pointer. This loop is not part of any region,
101 // except if the region describes the whole function.
103 return getExit() == 0;
105 if (!contains(L
->getHeader()))
108 SmallVector
<BasicBlock
*, 8> ExitingBlocks
;
109 L
->getExitingBlocks(ExitingBlocks
);
111 for (SmallVectorImpl
<BasicBlock
*>::iterator BI
= ExitingBlocks
.begin(),
112 BE
= ExitingBlocks
.end(); BI
!= BE
; ++BI
)
119 Loop
*Region::outermostLoopInRegion(Loop
*L
) const {
123 while (L
&& contains(L
->getParentLoop())) {
124 L
= L
->getParentLoop();
130 Loop
*Region::outermostLoopInRegion(LoopInfo
*LI
, BasicBlock
* BB
) const {
131 assert(LI
&& BB
&& "LI and BB cannot be null!");
132 Loop
*L
= LI
->getLoopFor(BB
);
133 return outermostLoopInRegion(L
);
136 BasicBlock
*Region::getEnteringBlock() const {
137 BasicBlock
*entry
= getEntry();
139 BasicBlock
*enteringBlock
= 0;
141 for (pred_iterator PI
= pred_begin(entry
), PE
= pred_end(entry
); PI
!= PE
;
144 if (DT
->getNode(Pred
) && !contains(Pred
)) {
148 enteringBlock
= Pred
;
152 return enteringBlock
;
155 BasicBlock
*Region::getExitingBlock() const {
156 BasicBlock
*exit
= getExit();
158 BasicBlock
*exitingBlock
= 0;
163 for (pred_iterator PI
= pred_begin(exit
), PE
= pred_end(exit
); PI
!= PE
;
166 if (contains(Pred
)) {
177 bool Region::isSimple() const {
178 return !isTopLevelRegion() && getEnteringBlock() && getExitingBlock();
181 std::string
Region::getNameStr() const {
182 std::string exitName
;
183 std::string entryName
;
185 if (getEntry()->getName().empty()) {
186 raw_string_ostream
OS(entryName
);
188 WriteAsOperand(OS
, getEntry(), false);
189 entryName
= OS
.str();
191 entryName
= getEntry()->getNameStr();
194 if (getExit()->getName().empty()) {
195 raw_string_ostream
OS(exitName
);
197 WriteAsOperand(OS
, getExit(), false);
200 exitName
= getExit()->getNameStr();
202 exitName
= "<Function Return>";
204 return entryName
+ " => " + exitName
;
207 void Region::verifyBBInRegion(BasicBlock
*BB
) const {
209 llvm_unreachable("Broken region found!");
211 BasicBlock
*entry
= getEntry(), *exit
= getExit();
213 for (succ_iterator SI
= succ_begin(BB
), SE
= succ_end(BB
); SI
!= SE
; ++SI
)
214 if (!contains(*SI
) && exit
!= *SI
)
215 llvm_unreachable("Broken region found!");
218 for (pred_iterator SI
= pred_begin(BB
), SE
= pred_end(BB
); SI
!= SE
; ++SI
)
220 llvm_unreachable("Broken region found!");
223 void Region::verifyWalk(BasicBlock
*BB
, std::set
<BasicBlock
*> *visited
) const {
224 BasicBlock
*exit
= getExit();
228 verifyBBInRegion(BB
);
230 for (succ_iterator SI
= succ_begin(BB
), SE
= succ_end(BB
); SI
!= SE
; ++SI
)
231 if (*SI
!= exit
&& visited
->find(*SI
) == visited
->end())
232 verifyWalk(*SI
, visited
);
235 void Region::verifyRegion() const {
236 // Only do verification when user wants to, otherwise this expensive
237 // check will be invoked by PassManager.
238 if (!VerifyRegionInfo
) return;
240 std::set
<BasicBlock
*> visited
;
241 verifyWalk(getEntry(), &visited
);
244 void Region::verifyRegionNest() const {
245 for (Region::const_iterator RI
= begin(), RE
= end(); RI
!= RE
; ++RI
)
246 (*RI
)->verifyRegionNest();
251 Region::block_iterator
Region::block_begin() {
252 return GraphTraits
<FlatIt
<Region
*> >::nodes_begin(this);
255 Region::block_iterator
Region::block_end() {
256 return GraphTraits
<FlatIt
<Region
*> >::nodes_end(this);
259 Region::const_block_iterator
Region::block_begin() const {
260 return GraphTraits
<FlatIt
<const Region
*> >::nodes_begin(this);
263 Region::const_block_iterator
Region::block_end() const {
264 return GraphTraits
<FlatIt
<const Region
*> >::nodes_end(this);
267 Region::element_iterator
Region::element_begin() {
268 return GraphTraits
<Region
*>::nodes_begin(this);
271 Region::element_iterator
Region::element_end() {
272 return GraphTraits
<Region
*>::nodes_end(this);
275 Region::const_element_iterator
Region::element_begin() const {
276 return GraphTraits
<const Region
*>::nodes_begin(this);
279 Region::const_element_iterator
Region::element_end() const {
280 return GraphTraits
<const Region
*>::nodes_end(this);
283 Region
* Region::getSubRegionNode(BasicBlock
*BB
) const {
284 Region
*R
= RI
->getRegionFor(BB
);
289 // If we pass the BB out of this region, that means our code is broken.
290 assert(contains(R
) && "BB not in current region!");
292 while (contains(R
->getParent()) && R
->getParent() != this)
295 if (R
->getEntry() != BB
)
301 RegionNode
* Region::getBBNode(BasicBlock
*BB
) const {
302 assert(contains(BB
) && "Can get BB node out of this region!");
304 BBNodeMapT::const_iterator at
= BBNodeMap
.find(BB
);
306 if (at
!= BBNodeMap
.end())
309 RegionNode
*NewNode
= new RegionNode(const_cast<Region
*>(this), BB
);
310 BBNodeMap
.insert(std::make_pair(BB
, NewNode
));
314 RegionNode
* Region::getNode(BasicBlock
*BB
) const {
315 assert(contains(BB
) && "Can get BB node out of this region!");
316 if (Region
* Child
= getSubRegionNode(BB
))
317 return Child
->getNode();
319 return getBBNode(BB
);
322 void Region::transferChildrenTo(Region
*To
) {
323 for (iterator I
= begin(), E
= end(); I
!= E
; ++I
) {
325 To
->children
.push_back(*I
);
330 void Region::addSubRegion(Region
*SubRegion
, bool moveChildren
) {
331 assert(SubRegion
->parent
== 0 && "SubRegion already has a parent!");
332 assert(std::find(begin(), end(), SubRegion
) == children
.end()
333 && "Subregion already exists!");
335 SubRegion
->parent
= this;
336 children
.push_back(SubRegion
);
341 assert(SubRegion
->children
.size() == 0
342 && "SubRegions that contain children are not supported");
344 for (element_iterator I
= element_begin(), E
= element_end(); I
!= E
; ++I
)
345 if (!(*I
)->isSubRegion()) {
346 BasicBlock
*BB
= (*I
)->getNodeAs
<BasicBlock
>();
348 if (SubRegion
->contains(BB
))
349 RI
->setRegionFor(BB
, SubRegion
);
352 std::vector
<Region
*> Keep
;
353 for (iterator I
= begin(), E
= end(); I
!= E
; ++I
)
354 if (SubRegion
->contains(*I
) && *I
!= SubRegion
) {
355 SubRegion
->children
.push_back(*I
);
356 (*I
)->parent
= SubRegion
;
361 children
.insert(children
.begin(), Keep
.begin(), Keep
.end());
365 Region
*Region::removeSubRegion(Region
*Child
) {
366 assert(Child
->parent
== this && "Child is not a child of this region!");
368 RegionSet::iterator I
= std::find(children
.begin(), children
.end(), Child
);
369 assert(I
!= children
.end() && "Region does not exit. Unable to remove.");
370 children
.erase(children
.begin()+(I
-begin()));
374 unsigned Region::getDepth() const {
377 for (Region
*R
= parent
; R
!= 0; R
= R
->parent
)
383 Region
*Region::getExpandedRegion() const {
384 unsigned NumSuccessors
= exit
->getTerminator()->getNumSuccessors();
386 if (NumSuccessors
== 0)
389 for (pred_iterator PI
= pred_begin(getExit()), PE
= pred_end(getExit());
391 if (!DT
->dominates(getEntry(), *PI
))
394 Region
*R
= RI
->getRegionFor(exit
);
396 if (R
->getEntry() != exit
) {
397 if (exit
->getTerminator()->getNumSuccessors() == 1)
398 return new Region(getEntry(), *succ_begin(exit
), RI
, DT
);
403 while (R
->getParent() && R
->getParent()->getEntry() == exit
)
406 if (!DT
->dominates(getEntry(), R
->getExit()))
407 for (pred_iterator PI
= pred_begin(getExit()), PE
= pred_end(getExit());
409 if (!DT
->dominates(R
->getExit(), *PI
))
412 return new Region(getEntry(), R
->getExit(), RI
, DT
);
415 void Region::print(raw_ostream
&OS
, bool print_tree
, unsigned level
,
416 enum PrintStyle Style
) const {
418 OS
.indent(level
*2) << "[" << level
<< "] " << getNameStr();
420 OS
.indent(level
*2) << getNameStr();
425 if (Style
!= PrintNone
) {
426 OS
.indent(level
*2) << "{\n";
427 OS
.indent(level
*2 + 2);
429 if (Style
== PrintBB
) {
430 for (const_block_iterator I
= block_begin(), E
= block_end(); I
!=E
; ++I
)
431 OS
<< **I
<< ", "; // TODO: remove the last ","
432 } else if (Style
== PrintRN
) {
433 for (const_element_iterator I
= element_begin(), E
= element_end(); I
!=E
; ++I
)
434 OS
<< **I
<< ", "; // TODO: remove the last ",
441 for (const_iterator RI
= begin(), RE
= end(); RI
!= RE
; ++RI
)
442 (*RI
)->print(OS
, print_tree
, level
+1, Style
);
444 if (Style
!= PrintNone
)
445 OS
.indent(level
*2) << "} \n";
448 void Region::dump() const {
449 print(dbgs(), true, getDepth(), printStyle
.getValue());
452 void Region::clearNodeCache() {
453 // Free the cached nodes.
454 for (BBNodeMapT::iterator I
= BBNodeMap
.begin(),
455 IE
= BBNodeMap
.end(); I
!= IE
; ++I
)
459 for (Region::iterator RI
= begin(), RE
= end(); RI
!= RE
; ++RI
)
460 (*RI
)->clearNodeCache();
463 //===----------------------------------------------------------------------===//
464 // RegionInfo implementation
467 bool RegionInfo::isCommonDomFrontier(BasicBlock
*BB
, BasicBlock
*entry
,
468 BasicBlock
*exit
) const {
469 for (pred_iterator PI
= pred_begin(BB
), PE
= pred_end(BB
); PI
!= PE
; ++PI
) {
471 if (DT
->dominates(entry
, P
) && !DT
->dominates(exit
, P
))
477 bool RegionInfo::isRegion(BasicBlock
*entry
, BasicBlock
*exit
) const {
478 assert(entry
&& exit
&& "entry and exit must not be null!");
479 typedef DominanceFrontier::DomSetType DST
;
481 DST
*entrySuccs
= &DF
->find(entry
)->second
;
483 // Exit is the header of a loop that contains the entry. In this case,
484 // the dominance frontier must only contain the exit.
485 if (!DT
->dominates(entry
, exit
)) {
486 for (DST::iterator SI
= entrySuccs
->begin(), SE
= entrySuccs
->end();
488 if (*SI
!= exit
&& *SI
!= entry
)
494 DST
*exitSuccs
= &DF
->find(exit
)->second
;
496 // Do not allow edges leaving the region.
497 for (DST::iterator SI
= entrySuccs
->begin(), SE
= entrySuccs
->end();
499 if (*SI
== exit
|| *SI
== entry
)
501 if (exitSuccs
->find(*SI
) == exitSuccs
->end())
503 if (!isCommonDomFrontier(*SI
, entry
, exit
))
507 // Do not allow edges pointing into the region.
508 for (DST::iterator SI
= exitSuccs
->begin(), SE
= exitSuccs
->end();
510 if (DT
->properlyDominates(entry
, *SI
) && *SI
!= exit
)
517 void RegionInfo::insertShortCut(BasicBlock
*entry
, BasicBlock
*exit
,
518 BBtoBBMap
*ShortCut
) const {
519 assert(entry
&& exit
&& "entry and exit must not be null!");
521 BBtoBBMap::iterator e
= ShortCut
->find(exit
);
523 if (e
== ShortCut
->end())
524 // No further region at exit available.
525 (*ShortCut
)[entry
] = exit
;
527 // We found a region e that starts at exit. Therefore (entry, e->second)
528 // is also a region, that is larger than (entry, exit). Insert the
530 BasicBlock
*BB
= e
->second
;
531 (*ShortCut
)[entry
] = BB
;
535 DomTreeNode
* RegionInfo::getNextPostDom(DomTreeNode
* N
,
536 BBtoBBMap
*ShortCut
) const {
537 BBtoBBMap::iterator e
= ShortCut
->find(N
->getBlock());
539 if (e
== ShortCut
->end())
542 return PDT
->getNode(e
->second
)->getIDom();
545 bool RegionInfo::isTrivialRegion(BasicBlock
*entry
, BasicBlock
*exit
) const {
546 assert(entry
&& exit
&& "entry and exit must not be null!");
548 unsigned num_successors
= succ_end(entry
) - succ_begin(entry
);
550 if (num_successors
<= 1 && exit
== *(succ_begin(entry
)))
556 void RegionInfo::updateStatistics(Region
*R
) {
559 // TODO: Slow. Should only be enabled if -stats is used.
560 if (R
->isSimple()) ++numSimpleRegions
;
563 Region
*RegionInfo::createRegion(BasicBlock
*entry
, BasicBlock
*exit
) {
564 assert(entry
&& exit
&& "entry and exit must not be null!");
566 if (isTrivialRegion(entry
, exit
))
569 Region
*region
= new Region(entry
, exit
, this, DT
);
570 BBtoRegion
.insert(std::make_pair(entry
, region
));
573 region
->verifyRegion();
575 DEBUG(region
->verifyRegion());
578 updateStatistics(region
);
582 void RegionInfo::findRegionsWithEntry(BasicBlock
*entry
, BBtoBBMap
*ShortCut
) {
585 DomTreeNode
*N
= PDT
->getNode(entry
);
590 Region
*lastRegion
= 0;
591 BasicBlock
*lastExit
= entry
;
593 // As only a BasicBlock that postdominates entry can finish a region, walk the
594 // post dominance tree upwards.
595 while ((N
= getNextPostDom(N
, ShortCut
))) {
596 BasicBlock
*exit
= N
->getBlock();
601 if (isRegion(entry
, exit
)) {
602 Region
*newRegion
= createRegion(entry
, exit
);
605 newRegion
->addSubRegion(lastRegion
);
607 lastRegion
= newRegion
;
611 // This can never be a region, so stop the search.
612 if (!DT
->dominates(entry
, exit
))
616 // Tried to create regions from entry to lastExit. Next time take a
617 // shortcut from entry to lastExit.
618 if (lastExit
!= entry
)
619 insertShortCut(entry
, lastExit
, ShortCut
);
622 void RegionInfo::scanForRegions(Function
&F
, BBtoBBMap
*ShortCut
) {
623 BasicBlock
*entry
= &(F
.getEntryBlock());
624 DomTreeNode
*N
= DT
->getNode(entry
);
626 // Iterate over the dominance tree in post order to start with the small
627 // regions from the bottom of the dominance tree. If the small regions are
628 // detected first, detection of bigger regions is faster, as we can jump
629 // over the small regions.
630 for (po_iterator
<DomTreeNode
*> FI
= po_begin(N
), FE
= po_end(N
); FI
!= FE
;
632 findRegionsWithEntry(FI
->getBlock(), ShortCut
);
636 Region
*RegionInfo::getTopMostParent(Region
*region
) {
637 while (region
->parent
)
638 region
= region
->getParent();
643 void RegionInfo::buildRegionsTree(DomTreeNode
*N
, Region
*region
) {
644 BasicBlock
*BB
= N
->getBlock();
646 // Passed region exit
647 while (BB
== region
->getExit())
648 region
= region
->getParent();
650 BBtoRegionMap::iterator it
= BBtoRegion
.find(BB
);
652 // This basic block is a start block of a region. It is already in the
653 // BBtoRegion relation. Only the child basic blocks have to be updated.
654 if (it
!= BBtoRegion
.end()) {
655 Region
*newRegion
= it
->second
;;
656 region
->addSubRegion(getTopMostParent(newRegion
));
659 BBtoRegion
[BB
] = region
;
662 for (DomTreeNode::iterator CI
= N
->begin(), CE
= N
->end(); CI
!= CE
; ++CI
)
663 buildRegionsTree(*CI
, region
);
666 void RegionInfo::releaseMemory() {
669 delete TopLevelRegion
;
673 RegionInfo::RegionInfo() : FunctionPass(ID
) {
674 initializeRegionInfoPass(*PassRegistry::getPassRegistry());
678 RegionInfo::~RegionInfo() {
682 void RegionInfo::Calculate(Function
&F
) {
683 // ShortCut a function where for every BB the exit of the largest region
684 // starting with BB is stored. These regions can be threated as single BBS.
685 // This improves performance on linear CFGs.
688 scanForRegions(F
, &ShortCut
);
689 BasicBlock
*BB
= &F
.getEntryBlock();
690 buildRegionsTree(DT
->getNode(BB
), TopLevelRegion
);
693 bool RegionInfo::runOnFunction(Function
&F
) {
696 DT
= &getAnalysis
<DominatorTree
>();
697 PDT
= &getAnalysis
<PostDominatorTree
>();
698 DF
= &getAnalysis
<DominanceFrontier
>();
700 TopLevelRegion
= new Region(&F
.getEntryBlock(), 0, this, DT
, 0);
701 updateStatistics(TopLevelRegion
);
708 void RegionInfo::getAnalysisUsage(AnalysisUsage
&AU
) const {
709 AU
.setPreservesAll();
710 AU
.addRequiredTransitive
<DominatorTree
>();
711 AU
.addRequired
<PostDominatorTree
>();
712 AU
.addRequired
<DominanceFrontier
>();
715 void RegionInfo::print(raw_ostream
&OS
, const Module
*) const {
716 OS
<< "Region tree:\n";
717 TopLevelRegion
->print(OS
, true, 0, printStyle
.getValue());
718 OS
<< "End region tree\n";
721 void RegionInfo::verifyAnalysis() const {
722 // Only do verification when user wants to, otherwise this expensive check
723 // will be invoked by PMDataManager::verifyPreservedAnalysis when
724 // a regionpass (marked PreservedAll) finish.
725 if (!VerifyRegionInfo
) return;
727 TopLevelRegion
->verifyRegionNest();
730 // Region pass manager support.
731 Region
*RegionInfo::getRegionFor(BasicBlock
*BB
) const {
732 BBtoRegionMap::const_iterator I
=
734 return I
!= BBtoRegion
.end() ? I
->second
: 0;
737 void RegionInfo::setRegionFor(BasicBlock
*BB
, Region
*R
) {
741 Region
*RegionInfo::operator[](BasicBlock
*BB
) const {
742 return getRegionFor(BB
);
745 BasicBlock
*RegionInfo::getMaxRegionExit(BasicBlock
*BB
) const {
746 BasicBlock
*Exit
= NULL
;
749 // Get largest region that starts at BB.
750 Region
*R
= getRegionFor(BB
);
751 while (R
&& R
->getParent() && R
->getParent()->getEntry() == BB
)
754 // Get the single exit of BB.
755 if (R
&& R
->getEntry() == BB
)
757 else if (++succ_begin(BB
) == succ_end(BB
))
758 Exit
= *succ_begin(BB
);
759 else // No single exit exists.
762 // Get largest region that starts at Exit.
763 Region
*ExitR
= getRegionFor(Exit
);
764 while (ExitR
&& ExitR
->getParent()
765 && ExitR
->getParent()->getEntry() == Exit
)
766 ExitR
= ExitR
->getParent();
768 for (pred_iterator PI
= pred_begin(Exit
), PE
= pred_end(Exit
); PI
!= PE
;
770 if (!R
->contains(*PI
) && !ExitR
->contains(*PI
))
773 // This stops infinite cycles.
774 if (DT
->dominates(Exit
, BB
))
784 RegionInfo::getCommonRegion(Region
*A
, Region
*B
) const {
785 assert (A
&& B
&& "One of the Regions is NULL");
787 if (A
->contains(B
)) return A
;
789 while (!B
->contains(A
))
796 RegionInfo::getCommonRegion(SmallVectorImpl
<Region
*> &Regions
) const {
797 Region
* ret
= Regions
.back();
800 for (SmallVectorImpl
<Region
*>::const_iterator I
= Regions
.begin(),
801 E
= Regions
.end(); I
!= E
; ++I
)
802 ret
= getCommonRegion(ret
, *I
);
808 RegionInfo::getCommonRegion(SmallVectorImpl
<BasicBlock
*> &BBs
) const {
809 Region
* ret
= getRegionFor(BBs
.back());
812 for (SmallVectorImpl
<BasicBlock
*>::const_iterator I
= BBs
.begin(),
813 E
= BBs
.end(); I
!= E
; ++I
)
814 ret
= getCommonRegion(ret
, getRegionFor(*I
));
819 void RegionInfo::splitBlock(BasicBlock
* NewBB
, BasicBlock
*OldBB
)
821 Region
*R
= getRegionFor(OldBB
);
823 setRegionFor(NewBB
, R
);
825 while (R
->getEntry() == OldBB
&& !R
->isTopLevelRegion()) {
826 R
->replaceEntry(NewBB
);
830 setRegionFor(OldBB
, R
);
833 char RegionInfo::ID
= 0;
834 INITIALIZE_PASS_BEGIN(RegionInfo
, "regions",
835 "Detect single entry single exit regions", true, true)
836 INITIALIZE_PASS_DEPENDENCY(DominatorTree
)
837 INITIALIZE_PASS_DEPENDENCY(PostDominatorTree
)
838 INITIALIZE_PASS_DEPENDENCY(DominanceFrontier
)
839 INITIALIZE_PASS_END(RegionInfo
, "regions",
840 "Detect single entry single exit regions", true, true)
842 // Create methods available outside of this file, to use them
843 // "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
844 // the link time optimization.
847 FunctionPass
*createRegionInfoPass() {
848 return new RegionInfo();