mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-31 10:34:17 +00:00
RegioInfo: Add getExpandedRegion().
getExpandedRegion() enables us to create non canonical regions. Those regions can be used to define the largerst region, that fullfills a certain property. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116397 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4bcc0228dc
commit
c69bd733c0
@ -292,6 +292,14 @@ public:
|
||||
/// @return The depth of the region.
|
||||
unsigned getDepth() const;
|
||||
|
||||
/// @brief Return a new (non canonical) region, that is obtained by joining
|
||||
/// this region with its predecessors.
|
||||
///
|
||||
/// @return A region also starting at getEntry(), but reaching to the next
|
||||
/// basic block that forms with getEntry() a (non canonical) region.
|
||||
/// NULL if such a basic block does not exist.
|
||||
Region *getExpandedRegion() const;
|
||||
|
||||
/// @brief Is this a simple region?
|
||||
///
|
||||
/// A region is simple if it has exactly one exit and one entry edge.
|
||||
|
@ -373,6 +373,38 @@ unsigned Region::getDepth() const {
|
||||
return Depth;
|
||||
}
|
||||
|
||||
Region *Region::getExpandedRegion() const {
|
||||
unsigned NumSuccessors = exit->getTerminator()->getNumSuccessors();
|
||||
|
||||
if (NumSuccessors == 0)
|
||||
return NULL;
|
||||
|
||||
for (pred_iterator PI = pred_begin(getExit()), PE = pred_end(getExit());
|
||||
PI != PE; ++PI)
|
||||
if (!DT->dominates(getEntry(), *PI))
|
||||
return NULL;
|
||||
|
||||
Region *R = RI->getRegionFor(exit);
|
||||
|
||||
if (R->getEntry() != exit) {
|
||||
if (exit->getTerminator()->getNumSuccessors() == 1)
|
||||
return new Region(getEntry(), *succ_begin(exit), RI, DT);
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
while (R->getParent() && R->getParent()->getEntry() == exit)
|
||||
R = R->getParent();
|
||||
|
||||
if (!DT->dominates(getEntry(), R->getExit()))
|
||||
for (pred_iterator PI = pred_begin(getExit()), PE = pred_end(getExit());
|
||||
PI != PE; ++PI)
|
||||
if (!DT->dominates(R->getExit(), *PI))
|
||||
return NULL;
|
||||
|
||||
return new Region(getEntry(), R->getExit(), RI, DT);
|
||||
}
|
||||
|
||||
void Region::print(raw_ostream &OS, bool print_tree, unsigned level) const {
|
||||
if (print_tree)
|
||||
OS.indent(level*2) << "[" << level << "] " << getNameStr();
|
||||
|
Loading…
x
Reference in New Issue
Block a user