From c21da273fe448f235b3e5ed0c9997cda8c2b343d Mon Sep 17 00:00:00 2001 From: Jonas Paulsson Date: Mon, 16 Feb 2015 15:39:26 +0000 Subject: [PATCH] [PBQP] Improve the assert for conservatively allocatables. Remember if the node ever was in this state instead of checking just the final state. Reviewed by Arnaud de Grandmaison. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229400 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/PBQP/ReductionRules.h | 2 +- include/llvm/CodeGen/RegAllocPBQP.h | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/include/llvm/CodeGen/PBQP/ReductionRules.h b/include/llvm/CodeGen/PBQP/ReductionRules.h index dae7da4ac9f..8f54ec93dd2 100644 --- a/include/llvm/CodeGen/PBQP/ReductionRules.h +++ b/include/llvm/CodeGen/PBQP/ReductionRules.h @@ -190,7 +190,7 @@ namespace PBQP { // 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()) + if (G.getNodeMetadata(NId).wasConservativelyAllocatable()) assert(hasRegisterOptions(v) && "A conservatively allocatable node " "must have available register options"); diff --git a/include/llvm/CodeGen/RegAllocPBQP.h b/include/llvm/CodeGen/RegAllocPBQP.h index 6d709d2b5e0..a117eb070f0 100644 --- a/include/llvm/CodeGen/RegAllocPBQP.h +++ b/include/llvm/CodeGen/RegAllocPBQP.h @@ -192,7 +192,7 @@ public: NodeMetadata() : RS(Unprocessed), NumOpts(0), DeniedOpts(0), OptUnsafeEdges(nullptr), - VReg(0) {} + VReg(0), everConservativelyAllocatable(false) {} // FIXME: Re-implementing default behavior to work around MSVC. Remove once // MSVC synthesizes move constructors properly. @@ -256,8 +256,14 @@ public: void setReductionState(ReductionState RS) { assert(RS >= this->RS && "A node's reduction state can not be downgraded"); this->RS = RS; + + // Remember this state to assert later that a non-infinite register + // option was available. + if (RS == ConservativelyAllocatable) + everConservativelyAllocatable = true; } + void handleAddEdge(const MatrixMetadata& MD, bool Transpose) { DeniedOpts += Transpose ? MD.getWorstRow() : MD.getWorstCol(); const bool* UnsafeOpts = @@ -280,6 +286,10 @@ public: &OptUnsafeEdges[NumOpts]); } + bool wasConservativelyAllocatable() const { + return everConservativelyAllocatable; + } + private: ReductionState RS; unsigned NumOpts; @@ -287,6 +297,7 @@ private: std::unique_ptr OptUnsafeEdges; unsigned VReg; GraphMetadata::AllowedRegVecRef AllowedRegs; + bool everConservativelyAllocatable; }; class RegAllocSolverImpl { -- 2.34.1