bool RegionInfo::isRegion(BasicBlock *entry, BasicBlock *exit) const { assert(entry && exit && "entry and exit must not be null!"); typedef DominanceFrontier::DomSetType DST; DST *entrySuccs = &DF->find(entry)->second; // Exit is the header of a loop that contains the entry. In this case, // the dominance frontier must only contain the exit. if (!DT->dominates(entry, exit)) { for (DST::iterator SI = entrySuccs->begin(), SE = entrySuccs->end(); SI != SE; ++SI) if (*SI != exit && *SI != entry) return false; return true; } DST *exitSuccs = &DF->find(exit)->second; // Do not allow edges leaving the region. for (DST::iterator SI = entrySuccs->begin(), SE = entrySuccs->end(); SI != SE; ++SI) { if (*SI == exit || *SI == entry) continue; if (exitSuccs->find(*SI) == exitSuccs->end()) return false; if (!isCommonDomFrontier(*SI, entry, exit)) return false; } // Do not allow edges pointing into the region. for (DST::iterator SI = exitSuccs->begin(), SE = exitSuccs->end(); SI != SE; ++SI) if (DT->properlyDominates(entry, *SI) && *SI != exit) return false; return true; }