[llvm-commits] [llvm] r129079 - in /llvm/trunk/lib/CodeGen: RegAllocGreedy.cpp SpillPlacement.cpp SpillPlacement.h
Jakob Stoklund Olesen
stoklund at 2pi.dk
Thu Apr 7 10:27:46 PDT 2011
Author: stoklund
Date: Thu Apr 7 12:27:46 2011
New Revision: 129079
URL: http://llvm.org/viewvc/llvm-project?rev=129079&view=rev
Log:
Extract SpillPlacement::addLinks for handling the special transparent blocks.
Modified:
llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp
llvm/trunk/lib/CodeGen/SpillPlacement.cpp
llvm/trunk/lib/CodeGen/SpillPlacement.h
Modified: llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp?rev=129079&r1=129078&r2=129079&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp (original)
+++ llvm/trunk/lib/CodeGen/RegAllocGreedy.cpp Thu Apr 7 12:27:46 2011
@@ -123,9 +123,13 @@
/// Cached per-block interference maps
InterferenceCache IntfCache;
- /// All basic blocks where the current register is live.
+ /// All basic blocks where the current register has uses.
SmallVector<SpillPlacement::BlockConstraint, 8> SplitConstraints;
+ /// All basic blocks where the current register is live-through and
+ /// interference free.
+ SmallVector<unsigned, 8> TransparentBlocks;
+
/// Global live range splitting candidate info.
struct GlobalSplitCandidate {
unsigned PhysReg;
@@ -475,6 +479,7 @@
const unsigned GroupSize = 8;
SpillPlacement::BlockConstraint BCS[GroupSize];
unsigned B = 0;
+ TransparentBlocks.clear();
ArrayRef<unsigned> ThroughBlocks = SA->getThroughBlocks();
for (unsigned i = 0; i != ThroughBlocks.size(); ++i) {
@@ -483,23 +488,23 @@
BCS[B].Number = Number;
Intf.moveToBlock(Number);
- if (Intf.hasInterference()) {
- // Interference for the live-in value.
- if (Intf.first() <= Indexes->getMBBStartIdx(Number))
- BCS[B].Entry = SpillPlacement::MustSpill;
- else
- BCS[B].Entry = SpillPlacement::PrefSpill;
-
- // Interference for the live-out value.
- if (Intf.last() >= SA->getLastSplitPoint(Number))
- BCS[B].Exit = SpillPlacement::MustSpill;
- else
- BCS[B].Exit = SpillPlacement::PrefSpill;
- } else {
- // No interference, transparent block.
- BCS[B].Entry = BCS[B].Exit = SpillPlacement::DontCare;
+ if (!Intf.hasInterference()) {
+ TransparentBlocks.push_back(Number);
+ continue;
}
+ // Interference for the live-in value.
+ if (Intf.first() <= Indexes->getMBBStartIdx(Number))
+ BCS[B].Entry = SpillPlacement::MustSpill;
+ else
+ BCS[B].Entry = SpillPlacement::PrefSpill;
+
+ // Interference for the live-out value.
+ if (Intf.last() >= SA->getLastSplitPoint(Number))
+ BCS[B].Exit = SpillPlacement::MustSpill;
+ else
+ BCS[B].Exit = SpillPlacement::PrefSpill;
+
if (++B == GroupSize) {
ArrayRef<SpillPlacement::BlockConstraint> Array(BCS, B);
SpillPlacer->addConstraints(Array);
@@ -512,7 +517,12 @@
ArrayRef<SpillPlacement::BlockConstraint> Array(BCS, B);
SpillPlacer->addConstraints(Array);
- return SpillPlacer->getPositiveNodes() != 0;
+ if (SpillPlacer->getPositiveNodes() == 0)
+ return false;
+
+ // There is still some positive bias. Add all the links.
+ SpillPlacer->addLinks(TransparentBlocks);
+ return true;
}
Modified: llvm/trunk/lib/CodeGen/SpillPlacement.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SpillPlacement.cpp?rev=129079&r1=129078&r2=129079&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SpillPlacement.cpp (original)
+++ llvm/trunk/lib/CodeGen/SpillPlacement.cpp Thu Apr 7 12:27:46 2011
@@ -213,23 +213,6 @@
for (ArrayRef<BlockConstraint>::iterator I = LiveBlocks.begin(),
E = LiveBlocks.end(); I != E; ++I) {
float Freq = getBlockFrequency(I->Number);
-
- // Is this a transparent block? Link ingoing and outgoing bundles.
- if (I->Entry == DontCare && I->Exit == DontCare) {
- unsigned ib = bundles->getBundle(I->Number, 0);
- unsigned ob = bundles->getBundle(I->Number, 1);
-
- // Ignore self-loops.
- if (ib == ob)
- continue;
- activate(ib);
- activate(ob);
- nodes[ib].addLink(ob, Freq, 1);
- nodes[ob].addLink(ib, Freq, 0);
- continue;
- }
-
- // This block is not transparent, but it can still add bias.
const float Bias[] = {
0, // DontCare,
1, // PrefReg,
@@ -253,6 +236,24 @@
}
}
+void SpillPlacement::addLinks(ArrayRef<unsigned> Links) {
+ for (ArrayRef<unsigned>::iterator I = Links.begin(), E = Links.end(); I != E;
+ ++I) {
+ unsigned Number = *I;
+ unsigned ib = bundles->getBundle(Number, 0);
+ unsigned ob = bundles->getBundle(Number, 1);
+
+ // Ignore self-loops.
+ if (ib == ob)
+ continue;
+ activate(ib);
+ activate(ob);
+ float Freq = getBlockFrequency(Number);
+ nodes[ib].addLink(ob, Freq, 1);
+ nodes[ob].addLink(ib, Freq, 0);
+ }
+}
+
/// iterate - Repeatedly update the Hopfield nodes until stability or the
/// maximum number of iterations is reached.
/// @param Linked - Numbers of linked nodes that need updating.
Modified: llvm/trunk/lib/CodeGen/SpillPlacement.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SpillPlacement.h?rev=129079&r1=129078&r2=129079&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SpillPlacement.h (original)
+++ llvm/trunk/lib/CodeGen/SpillPlacement.h Thu Apr 7 12:27:46 2011
@@ -89,11 +89,12 @@
/// addConstraints - Add constraints and biases. This method may be called
/// more than once to accumulate constraints.
/// @param LiveBlocks Constraints for blocks that have the variable live in or
- /// live out. DontCare/DontCare means the variable is live
- /// through the block. DontCare/X means the variable is live
- /// out, but not live in.
+ /// live out.
void addConstraints(ArrayRef<BlockConstraint> LiveBlocks);
+ /// addLinks - Add transparent blocks with the given numbers.
+ void addLinks(ArrayRef<unsigned> Links);
+
/// getPositiveNodes - Return the total number of graph nodes with a positive
/// bias after adding constraints.
unsigned getPositiveNodes() const { return PositiveNodes; }
More information about the llvm-commits
mailing list