From 19cd7ccdf1f6ba75648406c726fc1cfab9072b88 Mon Sep 17 00:00:00 2001 From: "Arnaud A. de Grandmaison" Date: Sun, 15 Feb 2015 10:35:31 +0000 Subject: [PATCH] [PBQP] Assert conservativelly allocatable nodes are spilled by choice. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229302 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/PBQP/ReductionRules.h | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/include/llvm/CodeGen/PBQP/ReductionRules.h b/include/llvm/CodeGen/PBQP/ReductionRules.h index cc495042195..dae7da4ac9f 100644 --- a/include/llvm/CodeGen/PBQP/ReductionRules.h +++ b/include/llvm/CodeGen/PBQP/ReductionRules.h @@ -144,6 +144,23 @@ namespace PBQP { // TODO: Try to normalize newly added/modified edge. } + // Does this Cost vector have any register options ? + template + bool hasRegisterOptions(const VectorT &V) { + unsigned VL = V.getLength(); + + // An empty or spill only cost vector does not provide any register option. + if (VL <= 1) + return false; + + // If there are registers in the cost vector, but all of them have infinite + // costs, then ... there is no available register. + for (unsigned i = 1; i < VL; ++i) + if (V[i] != std::numeric_limits::infinity()) + return true; + + return false; + } // \brief Find a solution to a fully reduced graph by backpropagation. // @@ -170,6 +187,13 @@ namespace PBQP { RawVector v = G.getNodeCosts(NId); + // Although a conservatively allocatable node can be allocated to a register, + // spilling it may provide a lower cost solution. Assert here that spilling + // is done by choice, not because there were no register available. + if (G.getNodeMetadata(NId).isConservativelyAllocatable()) + assert(hasRegisterOptions(v) && "A conservatively allocatable node " + "must have available register options"); + for (auto EId : G.adjEdgeIds(NId)) { const Matrix& edgeCosts = G.getEdgeCosts(EId); if (NId == G.getEdgeNode1Id(EId)) {