<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 14 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Hi,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I have polished up my patch for the assert regarding conservatively allocatable nodes. I find this assert to be desirable, as there is an implementation error somewhere if any of these nodes are spilled, but that is something that may not
 be detected, as most often the output is still legal. InlineSpiller only complains if a spilled register is spilled again, for instance.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Can I commit this or do you have any comments / opinion on this?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">/Jonas Paulsson<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Patch:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">From 64ecd655faa1a1d133247fefc545472c042e6368 Mon Sep 17 00:00:00 2001<o:p></o:p></p>
<p class="MsoNormal">From: Jonas Paulsson <jonas.paulsson@ericsson.com><o:p></o:p></p>
<p class="MsoNormal">Date: Wed, 28 Jan 2015 08:30:35 +0100<o:p></o:p></p>
<p class="MsoNormal">Subject: [PATCH] Assert in PBQP: A conservatively allocatable node should<o:p></o:p></p>
<p class="MsoNormal">never be spilled.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">---<o:p></o:p></p>
<p class="MsoNormal">include/llvm/CodeGen/RegAllocPBQP.h | 16 ++++++++++++++++<o:p></o:p></p>
<p class="MsoNormal">1 file changed, 16 insertions(+)<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">diff --git a/include/llvm/CodeGen/RegAllocPBQP.h b/include/llvm/CodeGen/RegAllocPBQP.h<o:p></o:p></p>
<p class="MsoNormal">index cfa6160..140abed8 100644<o:p></o:p></p>
<p class="MsoNormal">--- a/include/llvm/CodeGen/RegAllocPBQP.h<o:p></o:p></p>
<p class="MsoNormal">+++ b/include/llvm/CodeGen/RegAllocPBQP.h<o:p></o:p></p>
<p class="MsoNormal">@@ -308,6 +308,13 @@ public:<o:p></o:p></p>
<p class="MsoNormal">     setup();<o:p></o:p></p>
<p class="MsoNormal">     S = backpropagate(G, reduce());<o:p></o:p></p>
<p class="MsoNormal">     G.unsetSolver();<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifndef NDEBUG<o:p></o:p></p>
<p class="MsoNormal">+    for (auto NId : WasConservativelyAllocables)<o:p></o:p></p>
<p class="MsoNormal">+      assert (S.getSelection(NId) != PBQP::RegAlloc::getSpillOptionIdx() &&<o:p></o:p></p>
<p class="MsoNormal">+              "A conservatively allocatable node was spilled!");<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">     return S;<o:p></o:p></p>
<p class="MsoNormal">   }<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">@@ -464,6 +471,9 @@ private:<o:p></o:p></p>
<p class="MsoNormal">         NodeStack.push_back(NId);<o:p></o:p></p>
<p class="MsoNormal">         G.disconnectAllNeighborsFromNode(NId);<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+#ifndef NDEBUG<o:p></o:p></p>
<p class="MsoNormal">+        WasConservativelyAllocables.insert(NId);<o:p></o:p></p>
<p class="MsoNormal">+#endif<o:p></o:p></p>
<p class="MsoNormal">       } else if (!NotProvablyAllocatableNodes.empty()) {<o:p></o:p></p>
<p class="MsoNormal">         NodeSet::iterator NItr =<o:p></o:p></p>
<p class="MsoNormal">           std::min_element(NotProvablyAllocatableNodes.begin(),<o:p></o:p></p>
<p class="MsoNormal">@@ -497,6 +507,12 @@ private:<o:p></o:p></p>
<p class="MsoNormal">   NodeSet OptimallyReducibleNodes;<o:p></o:p></p>
<p class="MsoNormal">   NodeSet ConservativelyAllocatableNodes;<o:p></o:p></p>
<p class="MsoNormal">   NodeSet NotProvablyAllocatableNodes;<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+#ifndef NDEBUG<o:p></o:p></p>
<p class="MsoNormal">+  // A set of nodes to that were conservatively allocatable and are<o:p></o:p></p>
<p class="MsoNormal">+  // thus never supposed to be spilled.<o:p></o:p></p>
<p class="MsoNormal"><span lang="SV">+  NodeSet WasConservativelyAllocables;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="SV">+#endif<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="SV">};<o:p></o:p></span></p>
</div>
</body>
</html>