diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-04-06 19:14:00 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2011-04-06 19:14:00 +0000 |
commit | 70d4370b47cdd375bbea98e50452789fe4f1af04 (patch) | |
tree | add9c7e773a47c8ff88ca8840dd657c7614db4da /lib/CodeGen/SpillPlacement.cpp | |
parent | 9efa2a263ea470caacef1c85f6ca45e32bf516d3 (diff) |
Keep track of the number of positively biased nodes when adding constraints.
If there are no positive nodes, the algorithm can be aborted early.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129021 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/SpillPlacement.cpp')
-rw-r--r-- | lib/CodeGen/SpillPlacement.cpp | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/CodeGen/SpillPlacement.cpp b/lib/CodeGen/SpillPlacement.cpp index d648d5a9e1..0ccb93f871 100644 --- a/lib/CodeGen/SpillPlacement.cpp +++ b/lib/CodeGen/SpillPlacement.cpp @@ -134,10 +134,14 @@ struct SpillPlacement::Node { } /// addBias - Bias this node from an ingoing[0] or outgoing[1] link. - void addBias(float w, bool out) { + /// Return the change to the total number of positive biases. + int addBias(float w, bool out) { // Normalize w relative to all connected blocks from that direction. w /= Frequency[out]; + int Before = Bias > 0; Bias += w; + int After = Bias > 0; + return After - Before; } /// update - Recompute Value from Bias and Links. Return true when node @@ -237,14 +241,14 @@ void SpillPlacement::addConstraints(ArrayRef<BlockConstraint> LiveBlocks) { if (I->Entry != DontCare) { unsigned ib = bundles->getBundle(I->Number, 0); activate(ib); - nodes[ib].addBias(Freq * Bias[I->Entry], 1); + PositiveNodes += nodes[ib].addBias(Freq * Bias[I->Entry], 1); } // Live-out from block? if (I->Exit != DontCare) { unsigned ob = bundles->getBundle(I->Number, 1); activate(ob); - nodes[ob].addBias(Freq * Bias[I->Exit], 0); + PositiveNodes += nodes[ob].addBias(Freq * Bias[I->Exit], 0); } } } @@ -292,6 +296,7 @@ void SpillPlacement::prepare(BitVector &RegBundles) { ActiveNodes = &RegBundles; ActiveNodes->clear(); ActiveNodes->resize(bundles->getNumBundles()); + PositiveNodes = 0; } bool |