* Updated the cost matrix normalization proceedure to better handle infinite costs.

* Enabled R1/R2 application for nodes with infinite spill costs in the Briggs heuristic (made
safe by the changes to the normalization proceedure).
* Removed a redundant header.

llvm-svn: 95973
This commit is contained in:
Lang Hames 2010-02-12 09:43:37 +00:00
parent aa1cccbbef
commit c7ef4cc9fc
2 changed files with 21 additions and 13 deletions

View File

@ -18,7 +18,6 @@
#include "Graph.h"
#include "Solution.h"
#include "llvm/Support/raw_ostream.h"
#include <vector>
#include <limits>
@ -494,14 +493,23 @@ namespace PBQP {
bool tryNormaliseEdgeMatrix(Graph::EdgeItr &eItr) {
const PBQPNum infinity = std::numeric_limits<PBQPNum>::infinity();
Matrix &edgeCosts = g.getEdgeCosts(eItr);
Vector &uCosts = g.getNodeCosts(g.getEdgeNode1(eItr)),
&vCosts = g.getNodeCosts(g.getEdgeNode2(eItr));
for (unsigned r = 0; r < edgeCosts.getRows(); ++r) {
PBQPNum rowMin = edgeCosts.getRowMin(r);
PBQPNum rowMin = infinity;
for (unsigned c = 0; c < edgeCosts.getCols(); ++c) {
if (vCosts[c] != infinity && edgeCosts[r][c] < rowMin)
rowMin = edgeCosts[r][c];
}
uCosts[r] += rowMin;
if (rowMin != std::numeric_limits<PBQPNum>::infinity()) {
if (rowMin != infinity) {
edgeCosts.subFromRow(r, rowMin);
}
else {
@ -510,9 +518,16 @@ namespace PBQP {
}
for (unsigned c = 0; c < edgeCosts.getCols(); ++c) {
PBQPNum colMin = edgeCosts.getColMin(c);
PBQPNum colMin = infinity;
for (unsigned r = 0; r < edgeCosts.getRows(); ++r) {
if (uCosts[r] != infinity && edgeCosts[r][c] < colMin)
colMin = edgeCosts[r][c];
}
vCosts[c] += colMin;
if (colMin != std::numeric_limits<PBQPNum>::infinity()) {
if (colMin != infinity) {
edgeCosts.subFromCol(c, colMin);
}
else {

View File

@ -128,14 +128,7 @@ namespace PBQP {
/// selected for heuristic reduction instead.
bool shouldOptimallyReduce(Graph::NodeItr nItr) {
if (getSolver().getSolverDegree(nItr) < 3) {
if (getGraph().getNodeCosts(nItr)[0] !=
std::numeric_limits<PBQPNum>::infinity()) {
return true;
}
// Otherwise we have an infinite spill cost node.
initializeNode(nItr);
NodeData &nd = getHeuristicNodeData(nItr);
return nd.isAllocable;
return true;
}
// else
return false;