X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FCodeGen%2FSplitKit.h;h=9a7fa5388a1d575bfb82549e40625a9c18cd54a0;hb=e1dde7b05a83438eeba4bd83f8cf080f56d22c5b;hp=9ba7cbeb1001616326a2d7fcaf54dd25c4f7f5dc;hpb=d68f458244b9d9a6644a9550dd5cee60331c9e7d;p=oota-llvm.git diff --git a/lib/CodeGen/SplitKit.h b/lib/CodeGen/SplitKit.h index 9ba7cbeb100..9a7fa5388a1 100644 --- a/lib/CodeGen/SplitKit.h +++ b/lib/CodeGen/SplitKit.h @@ -22,7 +22,6 @@ class LiveInterval; class LiveIntervals; class LiveRangeEdit; class MachineInstr; -class MachineDominatorTree; class MachineLoop; class MachineLoopInfo; class MachineRegisterInfo; @@ -31,6 +30,11 @@ class VirtRegMap; class VNInfo; class raw_ostream; +/// At some point we should just include MachineDominators.h: +class MachineDominatorTree; +template class DomTreeNodeBase; +typedef DomTreeNodeBase MachineDomTreeNode; + /// SplitAnalysis - Analyze a LiveInterval, looking for live range splitting /// opportunities. class SplitAnalysis { @@ -171,6 +175,24 @@ class LiveIntervalMap { // values not present (unknown/unmapped). ValueMap valueMap_; + typedef std::pair LiveOutPair; + typedef DenseMap LiveOutMap; + + // liveOutCache_ - Map each basic block where li_ is live out to the live-out + // value and its defining block. One of these conditions shall be true: + // + // 1. !liveOutCache_.count(MBB) + // 2. liveOutCache_[MBB].second.getNode() == MBB + // 3. forall P in preds(MBB): liveOutCache_[P] == liveOutCache_[MBB] + // + // This is only a cache, the values can be computed as: + // + // VNI = li_->getVNInfoAt(lis_.getMBBEndIdx(MBB)) + // Node = mbt_[lis_.getMBBFromIndex(VNI->def)] + // + // The cache is also used as a visiteed set by mapValue(). + LiveOutMap liveOutCache_; + public: LiveIntervalMap(LiveIntervals &lis, MachineDominatorTree &mdt,