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/Support/raw_ostream.h"
20 #include "llvm/Analysis/LoopInfo.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 //===----------------------------------------------------------------------===//
45 /// PrintStyle - Print region in difference ways.
46 enum PrintStyle
{ PrintNone
, PrintBB
, PrintRN
};
48 static cl::opt
<enum PrintStyle
> printStyle("print-region-style", cl::Hidden
,
49 cl::desc("style of printing regions"),
51 clEnumValN(PrintNone
, "none", "print no details"),
52 clEnumValN(PrintBB
, "bb", "print regions in detail with block_iterator"),
53 clEnumValN(PrintRN
, "rn", "print regions in detail with element_iterator"),
55 //===----------------------------------------------------------------------===//
56 /// Region Implementation
57 Region::Region(BasicBlock
*Entry
, BasicBlock
*Exit
, RegionInfo
* RInfo
,
58 DominatorTree
*dt
, Region
*Parent
)
59 : RegionNode(Parent
, Entry
, 1), RI(RInfo
), DT(dt
), exit(Exit
) {}
62 // Free the cached nodes.
63 for (BBNodeMapT::iterator it
= BBNodeMap
.begin(),
64 ie
= BBNodeMap
.end(); it
!= ie
; ++it
)
67 // Only clean the cache for this Region. Caches of child Regions will be
68 // cleaned when the child Regions are deleted.
71 for (iterator I
= begin(), E
= end(); I
!= E
; ++I
)
75 void Region::replaceEntry(BasicBlock
*BB
) {
79 void Region::replaceExit(BasicBlock
*BB
) {
80 assert(exit
&& "No exit to replace!");
84 bool Region::contains(const BasicBlock
*B
) const {
85 BasicBlock
*BB
= const_cast<BasicBlock
*>(B
);
87 assert(DT
->getNode(BB
) && "BB not part of the dominance tree");
89 BasicBlock
*entry
= getEntry(), *exit
= getExit();
95 return (DT
->dominates(entry
, BB
)
96 && !(DT
->dominates(exit
, BB
) && DT
->dominates(entry
, exit
)));
99 bool Region::contains(const Loop
*L
) const {
100 // BBs that are not part of any loop are element of the Loop
101 // described by the NULL pointer. This loop is not part of any region,
102 // except if the region describes the whole function.
104 return getExit() == 0;
106 if (!contains(L
->getHeader()))
109 SmallVector
<BasicBlock
*, 8> ExitingBlocks
;
110 L
->getExitingBlocks(ExitingBlocks
);
112 for (SmallVectorImpl
<BasicBlock
*>::iterator BI
= ExitingBlocks
.begin(),
113 BE
= ExitingBlocks
.end(); BI
!= BE
; ++BI
)
120 Loop
*Region::outermostLoopInRegion(Loop
*L
) const {
124 while (L
&& contains(L
->getParentLoop())) {
125 L
= L
->getParentLoop();
131 Loop
*Region::outermostLoopInRegion(LoopInfo
*LI
, BasicBlock
* BB
) const {
132 assert(LI
&& BB
&& "LI and BB cannot be null!");
133 Loop
*L
= LI
->getLoopFor(BB
);
134 return outermostLoopInRegion(L
);
137 bool Region::isSimple() const {
138 bool isSimple
= true;
141 BasicBlock
*entry
= getEntry(), *exit
= getExit();
143 if (isTopLevelRegion())
146 for (pred_iterator PI
= pred_begin(entry
), PE
= pred_end(entry
); PI
!= PE
;
148 BasicBlock
*Pred
= *PI
;
149 if (DT
->getNode(Pred
) && !contains(Pred
)) {
160 for (pred_iterator PI
= pred_begin(exit
), PE
= pred_end(exit
); PI
!= PE
;
173 std::string
Region::getNameStr() const {
174 std::string exitName
;
175 std::string entryName
;
177 if (getEntry()->getName().empty()) {
178 raw_string_ostream
OS(entryName
);
180 WriteAsOperand(OS
, getEntry(), false);
181 entryName
= OS
.str();
183 entryName
= getEntry()->getNameStr();
186 if (getExit()->getName().empty()) {
187 raw_string_ostream
OS(exitName
);
189 WriteAsOperand(OS
, getExit(), false);
192 exitName
= getExit()->getNameStr();
194 exitName
= "<Function Return>";
196 return entryName
+ " => " + exitName
;
199 void Region::verifyBBInRegion(BasicBlock
*BB
) const {
201 llvm_unreachable("Broken region found!");
203 BasicBlock
*entry
= getEntry(), *exit
= getExit();
205 for (succ_iterator SI
= succ_begin(BB
), SE
= succ_end(BB
); SI
!= SE
; ++SI
)
206 if (!contains(*SI
) && exit
!= *SI
)
207 llvm_unreachable("Broken region found!");
210 for (pred_iterator SI
= pred_begin(BB
), SE
= pred_end(BB
); SI
!= SE
; ++SI
)
212 llvm_unreachable("Broken region found!");
215 void Region::verifyWalk(BasicBlock
*BB
, std::set
<BasicBlock
*> *visited
) const {
216 BasicBlock
*exit
= getExit();
220 verifyBBInRegion(BB
);
222 for (succ_iterator SI
= succ_begin(BB
), SE
= succ_end(BB
); SI
!= SE
; ++SI
)
223 if (*SI
!= exit
&& visited
->find(*SI
) == visited
->end())
224 verifyWalk(*SI
, visited
);
227 void Region::verifyRegion() const {
228 // Only do verification when user wants to, otherwise this expensive
229 // check will be invoked by PassManager.
230 if (!VerifyRegionInfo
) return;
232 std::set
<BasicBlock
*> visited
;
233 verifyWalk(getEntry(), &visited
);
236 void Region::verifyRegionNest() const {
237 for (Region::const_iterator RI
= begin(), RE
= end(); RI
!= RE
; ++RI
)
238 (*RI
)->verifyRegionNest();
243 Region::block_iterator
Region::block_begin() {
244 return GraphTraits
<FlatIt
<Region
*> >::nodes_begin(this);
247 Region::block_iterator
Region::block_end() {
248 return GraphTraits
<FlatIt
<Region
*> >::nodes_end(this);
251 Region::const_block_iterator
Region::block_begin() const {
252 return GraphTraits
<FlatIt
<const Region
*> >::nodes_begin(this);
255 Region::const_block_iterator
Region::block_end() const {
256 return GraphTraits
<FlatIt
<const Region
*> >::nodes_end(this);
259 Region::element_iterator
Region::element_begin() {
260 return GraphTraits
<Region
*>::nodes_begin(this);
263 Region::element_iterator
Region::element_end() {
264 return GraphTraits
<Region
*>::nodes_end(this);
267 Region::const_element_iterator
Region::element_begin() const {
268 return GraphTraits
<const Region
*>::nodes_begin(this);
271 Region::const_element_iterator
Region::element_end() const {
272 return GraphTraits
<const Region
*>::nodes_end(this);
275 Region
* Region::getSubRegionNode(BasicBlock
*BB
) const {
276 Region
*R
= RI
->getRegionFor(BB
);
281 // If we pass the BB out of this region, that means our code is broken.
282 assert(contains(R
) && "BB not in current region!");
284 while (contains(R
->getParent()) && R
->getParent() != this)
287 if (R
->getEntry() != BB
)
293 RegionNode
* Region::getBBNode(BasicBlock
*BB
) const {
294 assert(contains(BB
) && "Can get BB node out of this region!");
296 BBNodeMapT::const_iterator at
= BBNodeMap
.find(BB
);
298 if (at
!= BBNodeMap
.end())
301 RegionNode
*NewNode
= new RegionNode(const_cast<Region
*>(this), BB
);
302 BBNodeMap
.insert(std::make_pair(BB
, NewNode
));
306 RegionNode
* Region::getNode(BasicBlock
*BB
) const {
307 assert(contains(BB
) && "Can get BB node out of this region!");
308 if (Region
* Child
= getSubRegionNode(BB
))
309 return Child
->getNode();
311 return getBBNode(BB
);
314 void Region::transferChildrenTo(Region
*To
) {
315 for (iterator I
= begin(), E
= end(); I
!= E
; ++I
) {
317 To
->children
.push_back(*I
);
322 void Region::addSubRegion(Region
*SubRegion
, bool moveChildren
) {
323 assert(SubRegion
->parent
== 0 && "SubRegion already has a parent!");
324 assert(std::find(begin(), end(), SubRegion
) == children
.end()
325 && "Subregion already exists!");
327 SubRegion
->parent
= this;
328 children
.push_back(SubRegion
);
333 assert(SubRegion
->children
.size() == 0
334 && "SubRegions that contain children are not supported");
336 for (element_iterator I
= element_begin(), E
= element_end(); I
!= E
; ++I
)
337 if (!(*I
)->isSubRegion()) {
338 BasicBlock
*BB
= (*I
)->getNodeAs
<BasicBlock
>();
340 if (SubRegion
->contains(BB
))
341 RI
->setRegionFor(BB
, SubRegion
);
344 std::vector
<Region
*> Keep
;
345 for (iterator I
= begin(), E
= end(); I
!= E
; ++I
)
346 if (SubRegion
->contains(*I
) && *I
!= SubRegion
) {
347 SubRegion
->children
.push_back(*I
);
348 (*I
)->parent
= SubRegion
;
353 children
.insert(children
.begin(), Keep
.begin(), Keep
.end());
357 Region
*Region::removeSubRegion(Region
*Child
) {
358 assert(Child
->parent
== this && "Child is not a child of this region!");
360 RegionSet::iterator I
= std::find(children
.begin(), children
.end(), Child
);
361 assert(I
!= children
.end() && "Region does not exit. Unable to remove.");
362 children
.erase(children
.begin()+(I
-begin()));
366 unsigned Region::getDepth() const {
369 for (Region
*R
= parent
; R
!= 0; R
= R
->parent
)
375 Region
*Region::getExpandedRegion() const {
376 unsigned NumSuccessors
= exit
->getTerminator()->getNumSuccessors();
378 if (NumSuccessors
== 0)
381 for (pred_iterator PI
= pred_begin(getExit()), PE
= pred_end(getExit());
383 if (!DT
->dominates(getEntry(), *PI
))
386 Region
*R
= RI
->getRegionFor(exit
);
388 if (R
->getEntry() != exit
) {
389 if (exit
->getTerminator()->getNumSuccessors() == 1)
390 return new Region(getEntry(), *succ_begin(exit
), RI
, DT
);
395 while (R
->getParent() && R
->getParent()->getEntry() == exit
)
398 if (!DT
->dominates(getEntry(), R
->getExit()))
399 for (pred_iterator PI
= pred_begin(getExit()), PE
= pred_end(getExit());
401 if (!DT
->dominates(R
->getExit(), *PI
))
404 return new Region(getEntry(), R
->getExit(), RI
, DT
);
407 void Region::print(raw_ostream
&OS
, bool print_tree
, unsigned level
) const {
409 OS
.indent(level
*2) << "[" << level
<< "] " << getNameStr();
411 OS
.indent(level
*2) << getNameStr();
416 if (printStyle
!= PrintNone
) {
417 OS
.indent(level
*2) << "{\n";
418 OS
.indent(level
*2 + 2);
420 if (printStyle
== PrintBB
) {
421 for (const_block_iterator I
= block_begin(), E
= block_end(); I
!=E
; ++I
)
422 OS
<< **I
<< ", "; // TODO: remove the last ","
423 } else if (printStyle
== PrintRN
) {
424 for (const_element_iterator I
= element_begin(), E
= element_end(); I
!=E
; ++I
)
425 OS
<< **I
<< ", "; // TODO: remove the last ",
432 for (const_iterator RI
= begin(), RE
= end(); RI
!= RE
; ++RI
)
433 (*RI
)->print(OS
, print_tree
, level
+1);
435 if (printStyle
!= PrintNone
)
436 OS
.indent(level
*2) << "} \n";
439 void Region::dump() const {
440 print(dbgs(), true, getDepth());
443 void Region::clearNodeCache() {
444 // Free the cached nodes.
445 for (BBNodeMapT::iterator I
= BBNodeMap
.begin(),
446 IE
= BBNodeMap
.end(); I
!= IE
; ++I
)
450 for (Region::iterator RI
= begin(), RE
= end(); RI
!= RE
; ++RI
)
451 (*RI
)->clearNodeCache();
454 //===----------------------------------------------------------------------===//
455 // RegionInfo implementation
458 bool RegionInfo::isCommonDomFrontier(BasicBlock
*BB
, BasicBlock
*entry
,
459 BasicBlock
*exit
) const {
460 for (pred_iterator PI
= pred_begin(BB
), PE
= pred_end(BB
); PI
!= PE
; ++PI
) {
462 if (DT
->dominates(entry
, P
) && !DT
->dominates(exit
, P
))
468 bool RegionInfo::isRegion(BasicBlock
*entry
, BasicBlock
*exit
) const {
469 assert(entry
&& exit
&& "entry and exit must not be null!");
470 typedef DominanceFrontier::DomSetType DST
;
472 DST
*entrySuccs
= &DF
->find(entry
)->second
;
474 // Exit is the header of a loop that contains the entry. In this case,
475 // the dominance frontier must only contain the exit.
476 if (!DT
->dominates(entry
, exit
)) {
477 for (DST::iterator SI
= entrySuccs
->begin(), SE
= entrySuccs
->end();
479 if (*SI
!= exit
&& *SI
!= entry
)
485 DST
*exitSuccs
= &DF
->find(exit
)->second
;
487 // Do not allow edges leaving the region.
488 for (DST::iterator SI
= entrySuccs
->begin(), SE
= entrySuccs
->end();
490 if (*SI
== exit
|| *SI
== entry
)
492 if (exitSuccs
->find(*SI
) == exitSuccs
->end())
494 if (!isCommonDomFrontier(*SI
, entry
, exit
))
498 // Do not allow edges pointing into the region.
499 for (DST::iterator SI
= exitSuccs
->begin(), SE
= exitSuccs
->end();
501 if (DT
->properlyDominates(entry
, *SI
) && *SI
!= exit
)
508 void RegionInfo::insertShortCut(BasicBlock
*entry
, BasicBlock
*exit
,
509 BBtoBBMap
*ShortCut
) const {
510 assert(entry
&& exit
&& "entry and exit must not be null!");
512 BBtoBBMap::iterator e
= ShortCut
->find(exit
);
514 if (e
== ShortCut
->end())
515 // No further region at exit available.
516 (*ShortCut
)[entry
] = exit
;
518 // We found a region e that starts at exit. Therefore (entry, e->second)
519 // is also a region, that is larger than (entry, exit). Insert the
521 BasicBlock
*BB
= e
->second
;
522 (*ShortCut
)[entry
] = BB
;
526 DomTreeNode
* RegionInfo::getNextPostDom(DomTreeNode
* N
,
527 BBtoBBMap
*ShortCut
) const {
528 BBtoBBMap::iterator e
= ShortCut
->find(N
->getBlock());
530 if (e
== ShortCut
->end())
533 return PDT
->getNode(e
->second
)->getIDom();
536 bool RegionInfo::isTrivialRegion(BasicBlock
*entry
, BasicBlock
*exit
) const {
537 assert(entry
&& exit
&& "entry and exit must not be null!");
539 unsigned num_successors
= succ_end(entry
) - succ_begin(entry
);
541 if (num_successors
<= 1 && exit
== *(succ_begin(entry
)))
547 void RegionInfo::updateStatistics(Region
*R
) {
550 // TODO: Slow. Should only be enabled if -stats is used.
551 if (R
->isSimple()) ++numSimpleRegions
;
554 Region
*RegionInfo::createRegion(BasicBlock
*entry
, BasicBlock
*exit
) {
555 assert(entry
&& exit
&& "entry and exit must not be null!");
557 if (isTrivialRegion(entry
, exit
))
560 Region
*region
= new Region(entry
, exit
, this, DT
);
561 BBtoRegion
.insert(std::make_pair(entry
, region
));
564 region
->verifyRegion();
566 DEBUG(region
->verifyRegion());
569 updateStatistics(region
);
573 void RegionInfo::findRegionsWithEntry(BasicBlock
*entry
, BBtoBBMap
*ShortCut
) {
576 DomTreeNode
*N
= PDT
->getNode(entry
);
581 Region
*lastRegion
= 0;
582 BasicBlock
*lastExit
= entry
;
584 // As only a BasicBlock that postdominates entry can finish a region, walk the
585 // post dominance tree upwards.
586 while ((N
= getNextPostDom(N
, ShortCut
))) {
587 BasicBlock
*exit
= N
->getBlock();
592 if (isRegion(entry
, exit
)) {
593 Region
*newRegion
= createRegion(entry
, exit
);
596 newRegion
->addSubRegion(lastRegion
);
598 lastRegion
= newRegion
;
602 // This can never be a region, so stop the search.
603 if (!DT
->dominates(entry
, exit
))
607 // Tried to create regions from entry to lastExit. Next time take a
608 // shortcut from entry to lastExit.
609 if (lastExit
!= entry
)
610 insertShortCut(entry
, lastExit
, ShortCut
);
613 void RegionInfo::scanForRegions(Function
&F
, BBtoBBMap
*ShortCut
) {
614 BasicBlock
*entry
= &(F
.getEntryBlock());
615 DomTreeNode
*N
= DT
->getNode(entry
);
617 // Iterate over the dominance tree in post order to start with the small
618 // regions from the bottom of the dominance tree. If the small regions are
619 // detected first, detection of bigger regions is faster, as we can jump
620 // over the small regions.
621 for (po_iterator
<DomTreeNode
*> FI
= po_begin(N
), FE
= po_end(N
); FI
!= FE
;
623 findRegionsWithEntry(FI
->getBlock(), ShortCut
);
627 Region
*RegionInfo::getTopMostParent(Region
*region
) {
628 while (region
->parent
)
629 region
= region
->getParent();
634 void RegionInfo::buildRegionsTree(DomTreeNode
*N
, Region
*region
) {
635 BasicBlock
*BB
= N
->getBlock();
637 // Passed region exit
638 while (BB
== region
->getExit())
639 region
= region
->getParent();
641 BBtoRegionMap::iterator it
= BBtoRegion
.find(BB
);
643 // This basic block is a start block of a region. It is already in the
644 // BBtoRegion relation. Only the child basic blocks have to be updated.
645 if (it
!= BBtoRegion
.end()) {
646 Region
*newRegion
= it
->second
;;
647 region
->addSubRegion(getTopMostParent(newRegion
));
650 BBtoRegion
[BB
] = region
;
653 for (DomTreeNode::iterator CI
= N
->begin(), CE
= N
->end(); CI
!= CE
; ++CI
)
654 buildRegionsTree(*CI
, region
);
657 void RegionInfo::releaseMemory() {
660 delete TopLevelRegion
;
664 RegionInfo::RegionInfo() : FunctionPass(ID
) {
665 initializeRegionInfoPass(*PassRegistry::getPassRegistry());
669 RegionInfo::~RegionInfo() {
673 void RegionInfo::Calculate(Function
&F
) {
674 // ShortCut a function where for every BB the exit of the largest region
675 // starting with BB is stored. These regions can be threated as single BBS.
676 // This improves performance on linear CFGs.
679 scanForRegions(F
, &ShortCut
);
680 BasicBlock
*BB
= &F
.getEntryBlock();
681 buildRegionsTree(DT
->getNode(BB
), TopLevelRegion
);
684 bool RegionInfo::runOnFunction(Function
&F
) {
687 DT
= &getAnalysis
<DominatorTree
>();
688 PDT
= &getAnalysis
<PostDominatorTree
>();
689 DF
= &getAnalysis
<DominanceFrontier
>();
691 TopLevelRegion
= new Region(&F
.getEntryBlock(), 0, this, DT
, 0);
692 updateStatistics(TopLevelRegion
);
699 void RegionInfo::getAnalysisUsage(AnalysisUsage
&AU
) const {
700 AU
.setPreservesAll();
701 AU
.addRequiredTransitive
<DominatorTree
>();
702 AU
.addRequired
<PostDominatorTree
>();
703 AU
.addRequired
<DominanceFrontier
>();
706 void RegionInfo::print(raw_ostream
&OS
, const Module
*) const {
707 OS
<< "Region tree:\n";
708 TopLevelRegion
->print(OS
, true, 0);
709 OS
<< "End region tree\n";
712 void RegionInfo::verifyAnalysis() const {
713 // Only do verification when user wants to, otherwise this expensive check
714 // will be invoked by PMDataManager::verifyPreservedAnalysis when
715 // a regionpass (marked PreservedAll) finish.
716 if (!VerifyRegionInfo
) return;
718 TopLevelRegion
->verifyRegionNest();
721 // Region pass manager support.
722 Region
*RegionInfo::getRegionFor(BasicBlock
*BB
) const {
723 BBtoRegionMap::const_iterator I
=
725 return I
!= BBtoRegion
.end() ? I
->second
: 0;
728 void RegionInfo::setRegionFor(BasicBlock
*BB
, Region
*R
) {
732 Region
*RegionInfo::operator[](BasicBlock
*BB
) const {
733 return getRegionFor(BB
);
736 BasicBlock
*RegionInfo::getMaxRegionExit(BasicBlock
*BB
) const {
737 BasicBlock
*Exit
= NULL
;
740 // Get largest region that starts at BB.
741 Region
*R
= getRegionFor(BB
);
742 while (R
&& R
->getParent() && R
->getParent()->getEntry() == BB
)
745 // Get the single exit of BB.
746 if (R
&& R
->getEntry() == BB
)
748 else if (++succ_begin(BB
) == succ_end(BB
))
749 Exit
= *succ_begin(BB
);
750 else // No single exit exists.
753 // Get largest region that starts at Exit.
754 Region
*ExitR
= getRegionFor(Exit
);
755 while (ExitR
&& ExitR
->getParent()
756 && ExitR
->getParent()->getEntry() == Exit
)
757 ExitR
= ExitR
->getParent();
759 for (pred_iterator PI
= pred_begin(Exit
), PE
= pred_end(Exit
); PI
!= PE
;
761 if (!R
->contains(*PI
) && !ExitR
->contains(*PI
))
764 // This stops infinite cycles.
765 if (DT
->dominates(Exit
, BB
))
775 RegionInfo::getCommonRegion(Region
*A
, Region
*B
) const {
776 assert (A
&& B
&& "One of the Regions is NULL");
778 if (A
->contains(B
)) return A
;
780 while (!B
->contains(A
))
787 RegionInfo::getCommonRegion(SmallVectorImpl
<Region
*> &Regions
) const {
788 Region
* ret
= Regions
.back();
791 for (SmallVectorImpl
<Region
*>::const_iterator I
= Regions
.begin(),
792 E
= Regions
.end(); I
!= E
; ++I
)
793 ret
= getCommonRegion(ret
, *I
);
799 RegionInfo::getCommonRegion(SmallVectorImpl
<BasicBlock
*> &BBs
) const {
800 Region
* ret
= getRegionFor(BBs
.back());
803 for (SmallVectorImpl
<BasicBlock
*>::const_iterator I
= BBs
.begin(),
804 E
= BBs
.end(); I
!= E
; ++I
)
805 ret
= getCommonRegion(ret
, getRegionFor(*I
));
810 void RegionInfo::splitBlock(BasicBlock
* NewBB
, BasicBlock
*OldBB
)
812 Region
*R
= getRegionFor(OldBB
);
814 setRegionFor(NewBB
, R
);
816 while (R
->getEntry() == OldBB
&& !R
->isTopLevelRegion()) {
817 R
->replaceEntry(NewBB
);
821 setRegionFor(OldBB
, R
);
824 char RegionInfo::ID
= 0;
825 INITIALIZE_PASS_BEGIN(RegionInfo
, "regions",
826 "Detect single entry single exit regions", true, true)
827 INITIALIZE_PASS_DEPENDENCY(DominatorTree
)
828 INITIALIZE_PASS_DEPENDENCY(PostDominatorTree
)
829 INITIALIZE_PASS_DEPENDENCY(DominanceFrontier
)
830 INITIALIZE_PASS_END(RegionInfo
, "regions",
831 "Detect single entry single exit regions", true, true)
833 // Create methods available outside of this file, to use them
834 // "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
835 // the link time optimization.
838 FunctionPass
*createRegionInfoPass() {
839 return new RegionInfo();