diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-09-14 16:45:39 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-09-14 16:45:39 +0000 |
commit | c4c633852fbb8ab9ef2679b679d2862746d2fa3e (patch) | |
tree | 5b90b80896129848d5bbc51e5d695c23a6016b80 /lib | |
parent | 6148225b9590f18fcb6a1d3151d3158b316965e0 (diff) | |
download | external_llvm-c4c633852fbb8ab9ef2679b679d2862746d2fa3e.zip external_llvm-c4c633852fbb8ab9ef2679b679d2862746d2fa3e.tar.gz external_llvm-c4c633852fbb8ab9ef2679b679d2862746d2fa3e.tar.bz2 |
Hoist back-copies to the least busy dominator.
When a back-copy is hoisted to the nearest common dominator, keep
looking up the dominator tree for a less loopy dominator, and place the
back-copy there instead.
Don't do this when a single existing back-copy dominates all the others.
Assume the client knows what he is doing, and keep the dominating
back-copy.
This prevents us from hoisting back-copies into loops in most cases. If
a value is defined in a loop with multiple exits, we may still hoist
back-copies into that loop. That is the speed/size tradeoff.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139698 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/SplitKit.cpp | 63 | ||||
-rw-r--r-- | lib/CodeGen/SplitKit.h | 5 |
2 files changed, 66 insertions, 2 deletions
diff --git a/lib/CodeGen/SplitKit.cpp b/lib/CodeGen/SplitKit.cpp index 149def3..5f7fdcc 100644 --- a/lib/CodeGen/SplitKit.cpp +++ b/lib/CodeGen/SplitKit.cpp @@ -20,6 +20,7 @@ #include "llvm/CodeGen/LiveIntervalAnalysis.h" #include "llvm/CodeGen/MachineDominators.h" #include "llvm/CodeGen/MachineInstrBuilder.h" +#include "llvm/CodeGen/MachineLoopInfo.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" @@ -635,6 +636,60 @@ void SplitEditor::removeBackCopies(SmallVectorImpl<VNInfo*> &Copies) { } } +MachineBasicBlock* +SplitEditor::findShallowDominator(MachineBasicBlock *MBB, + MachineBasicBlock *DefMBB) { + if (MBB == DefMBB) + return MBB; + assert(MDT.dominates(DefMBB, MBB) && "MBB must be dominated by the def."); + + const MachineLoopInfo &Loops = SA.Loops; + const MachineLoop *DefLoop = Loops.getLoopFor(DefMBB); + MachineDomTreeNode *DefDomNode = MDT[DefMBB]; + + // Best candidate so far. + MachineBasicBlock *BestMBB = MBB; + unsigned BestDepth = UINT_MAX; + + for (;;) { + const MachineLoop *Loop = Loops.getLoopFor(MBB); + + // MBB isn't in a loop, it doesn't get any better. All dominators have a + // higher frequency by definition. + if (!Loop) { + DEBUG(dbgs() << "Def in BB#" << DefMBB->getNumber() << " dominates BB#" + << MBB->getNumber() << " at depth 0\n"); + return MBB; + } + + // We'll never be able to exit the DefLoop. + if (Loop == DefLoop) { + DEBUG(dbgs() << "Def in BB#" << DefMBB->getNumber() << " dominates BB#" + << MBB->getNumber() << " in the same loop\n"); + return MBB; + } + + // Least busy dominator seen so far. + unsigned Depth = Loop->getLoopDepth(); + if (Depth < BestDepth) { + BestMBB = MBB; + BestDepth = Depth; + DEBUG(dbgs() << "Def in BB#" << DefMBB->getNumber() << " dominates BB#" + << MBB->getNumber() << " at depth " << Depth << '\n'); + } + + // Leave loop by going to the immediate dominator of the loop header. + // This is a bigger stride than simply walking up the dominator tree. + MachineDomTreeNode *IDom = MDT[Loop->getHeader()]->getIDom(); + + // Too far up the dominator tree? + if (!IDom || !MDT.dominates(DefDomNode, IDom)) + return BestMBB; + + MBB = IDom->getBlock(); + } +} + void SplitEditor::hoistCopiesForSize() { // Get the complement interval, always RegIdx 0. LiveInterval *LI = Edit->get(0); @@ -706,10 +761,14 @@ void SplitEditor::hoistCopiesForSize() { DomPair &Dom = NearestDom[i]; if (!Dom.first || Dom.second.isValid()) continue; - // This value needs a hoisted copy inserted at the end of Dom.second. + // This value needs a hoisted copy inserted at the end of Dom.first. + VNInfo *ParentVNI = Parent->getValNumInfo(i); + MachineBasicBlock *DefMBB = LIS.getMBBFromIndex(ParentVNI->def); + // Get a less loopy dominator than Dom.first. + Dom.first = findShallowDominator(Dom.first, DefMBB); SlotIndex Last = LIS.getMBBEndIdx(Dom.first).getPrevSlot(); Dom.second = - defFromParent(0, Parent->getValNumInfo(i), Last, *Dom.first, + defFromParent(0, ParentVNI, Last, *Dom.first, LIS.getLastSplitPoint(Edit->getParent(), Dom.first))->def; } diff --git a/lib/CodeGen/SplitKit.h b/lib/CodeGen/SplitKit.h index 5a294e5..d8fc212 100644 --- a/lib/CodeGen/SplitKit.h +++ b/lib/CodeGen/SplitKit.h @@ -315,6 +315,11 @@ private: /// in the vector in the complement interval. void removeBackCopies(SmallVectorImpl<VNInfo*> &Copies); + /// getShallowDominator - Returns the least busy dominator of MBB that is + /// also dominated by DefMBB. Busy is measured by loop depth. + MachineBasicBlock *findShallowDominator(MachineBasicBlock *MBB, + MachineBasicBlock *DefMBB); + /// hoistCopiesForSize - Hoist back-copies to the complement interval in a /// way that minimizes code size. This implements the SM_Size spill mode. void hoistCopiesForSize(); |