[llvm-commits] [llvm] r125132 - /llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp
Jakob Stoklund Olesen
stoklund at 2pi.dk
Tue Feb 8 15:02:58 PST 2011
Author: stoklund
Date: Tue Feb 8 17:02:58 2011
New Revision: 125132
URL: http://llvm.org/viewvc/llvm-project?rev=125132&view=rev
Log:
Reorganize interference code to check LastSplitPoint first.
The last split point can be anywhere in the block, so it interferes with the
strictly monotonic requirements of advanceTo().
Modified:
llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp
Modified: llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp?rev=125132&r1=125131&r2=125132&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp (original)
+++ llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp Tue Feb 8 17:02:58 2011
@@ -449,6 +449,8 @@
if (!IntI.valid())
continue;
+ // Determine which blocks have interference live in or after the last split
+ // point.
for (unsigned i = 0, e = LiveBlocks.size(); i != e; ++i) {
BlockInfo &BI = LiveBlocks[i];
SpillPlacement::BlockConstraint &BC = SpillConstraints[i];
@@ -459,29 +461,51 @@
if (IntI.start() >= Stop)
continue;
- // Handle transparent blocks with interference separately.
- // Transparent blocks never incur any fixed cost.
- if (BI.LiveThrough && !BI.Uses) {
- // Check if interference is live-in - force spill.
- if (BC.Entry != SpillPlacement::MustSpill) {
- BC.Entry = SpillPlacement::PrefSpill;
- IntI.advanceTo(Start);
- if (IntI.valid() && IntI.start() <= Start)
- BC.Entry = SpillPlacement::MustSpill;
- }
+ // Is the interference live-in?
+ if (BI.LiveIn) {
+ IntI.advanceTo(Start);
+ if (!IntI.valid())
+ break;
+ if (IntI.start() <= Start)
+ BC.Entry = SpillPlacement::MustSpill;
+ }
- // Check if interference is live-out - force spill.
- if (BC.Exit != SpillPlacement::MustSpill) {
- BC.Exit = SpillPlacement::PrefSpill;
- // Any interference overlapping [LastSplitPoint;Stop) forces a spill.
+ // Is the interference overlapping the last split point?
+ if (BI.LiveOut) {
+ if (IntI.stop() < BI.LastSplitPoint)
IntI.advanceTo(BI.LastSplitPoint.getPrevSlot());
- if (IntI.valid() && IntI.start() < Stop)
- BC.Exit = SpillPlacement::MustSpill;
- }
+ if (!IntI.valid())
+ break;
+ if (IntI.start() < Stop)
+ BC.Exit = SpillPlacement::MustSpill;
+ }
+ }
- // Nothing more to do for this transparent block.
+ // Rewind iterator and check other interferences.
+ IntI.find(VirtReg.beginIndex());
+ for (unsigned i = 0, e = LiveBlocks.size(); i != e; ++i) {
+ BlockInfo &BI = LiveBlocks[i];
+ SpillPlacement::BlockConstraint &BC = SpillConstraints[i];
+ SlotIndex Start, Stop;
+ tie(Start, Stop) = Indexes->getMBBRange(BI.MBB);
+
+ // Skip interference-free blocks.
+ if (IntI.start() >= Stop)
+ continue;
+
+ // Handle transparent blocks with interference separately.
+ // Transparent blocks never incur any fixed cost.
+ if (BI.LiveThrough && !BI.Uses) {
+ IntI.advanceTo(Start);
if (!IntI.valid())
break;
+ if (IntI.start() >= Stop)
+ continue;
+
+ if (BC.Entry != SpillPlacement::MustSpill)
+ BC.Entry = SpillPlacement::PrefSpill;
+ if (BC.Exit != SpillPlacement::MustSpill)
+ BC.Exit = SpillPlacement::PrefSpill;
continue;
}
@@ -494,12 +518,8 @@
IntI.advanceTo(Start);
if (!IntI.valid())
break;
-
- // Interference is live-in - force spill.
- if (IntI.start() <= Start)
- BC.Entry = SpillPlacement::MustSpill;
// Not live in, but before the first use.
- else if (IntI.start() < BI.FirstUse)
+ if (IntI.start() < BI.FirstUse)
BC.Entry = SpillPlacement::PrefSpill;
}
@@ -534,12 +554,6 @@
if (IntI.start() < Stop)
BC.Exit = SpillPlacement::PrefSpill;
}
- // Is the interference overlapping the last split point?
- IntI.advanceTo(BI.LastSplitPoint.getPrevSlot());
- if (!IntI.valid())
- break;
- if (IntI.start() < Stop)
- BC.Exit = SpillPlacement::MustSpill;
}
}
}
More information about the llvm-commits
mailing list