[PBQP] Assert conservativelly allocatable nodes are spilled by choice.
authorArnaud A. de Grandmaison <arnaud.degrandmaison@arm.com>
Sun, 15 Feb 2015 10:35:31 +0000 (10:35 +0000)
committerArnaud A. de Grandmaison <arnaud.degrandmaison@arm.com>
Sun, 15 Feb 2015 10:35:31 +0000 (10:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229302 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/PBQP/ReductionRules.h

index cc4950421950e9b2f7d06eaa38458a66757e2c9a..dae7da4ac9fc152964b12b00ba346c0527638067 100644 (file)
@@ -144,6 +144,23 @@ namespace PBQP {
     // TODO: Try to normalize newly added/modified edge.
   }
 
+  // Does this Cost vector have any register options ?
+  template <typename VectorT>
+  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<PBQP::PBQPNum>::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)) {