<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 12 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        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;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
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">Well, I found out the reason why this assert is here, and this is problematic.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">CondCodeActions only supports up to 32 different value types. Since we are past 32, what LLVM has is broken.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Currently the 4 different Legalize states are stored in successive bits and packed into a uin64_t, see TargetLowering.h.<o:p></o:p></p>
<p class="MsoNormal">/// CondCodeActions - For each condition code (ISD::CondCode) keep a<o:p></o:p></p>
<p class="MsoNormal">  /// LegalizeAction that indicates how instruction selection should<o:p></o:p></p>
<p class="MsoNormal">  /// deal with the condition code.<o:p></o:p></p>
<p class="MsoNormal">  uint64_t CondCodeActions[ISD::SETCC_INVALID];<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">What I suggest is the following: <o:p></o:p></p>
<p class="MsoNormal">Change the definition of CondCodeAction to:<o:p></o:p></p>
<p class="MsoNormal">  uint64_t CondCodeActions[ISD::SETCC_INVALID][2];<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">setCondCodeAction then becomes:<o:p></o:p></p>
<p class="MsoNormal">void setCondCodeAction(ISD::CondCode CC, MVT VT,<o:p></o:p></p>
<p class="MsoNormal">                         LegalizeAction Action) {<o:p></o:p></p>
<p class="MsoNormal">    assert(VT < MVT::LAST_VALUETYPE &&<o:p></o:p></p>
<p class="MsoNormal">           (unsigned)CC < array_lengthof(CondCodeActions) &&<o:p></o:p></p>
<p class="MsoNormal">           "Table isn't big enough!");<o:p></o:p></p>
<p class="MsoNormal">    CondCodeActions[(unsigned)CC][VT.SimplyTy >> 5] &= ~(uint64_t(3UL)  << (VT.SimpleTy - 32)*2);<o:p></o:p></p>
<p class="MsoNormal">    CondCodeActions[(unsigned)CC][VT.SimpleTy >> 5] |= (uint64_t)Action << (VT.SimpleTy - 32)*2;<o:p></o:p></p>
<p class="MsoNormal">  }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">getCondCodeAction then becomes:<o:p></o:p></p>
<p class="MsoNormal">LegalizeAction<o:p></o:p></p>
<p class="MsoNormal">  getCondCodeAction(ISD::CondCode CC, EVT VT) const {<o:p></o:p></p>
<p class="MsoNormal">    assert((unsigned)CC < array_lengthof(CondCodeActions) &&<o:p></o:p></p>
<p class="MsoNormal">           (unsigned)VT.getSimpleVT().SimpleTy < MVT::LAST_VECTOR_VALUETYPE &&<o:p></o:p></p>
<p class="MsoNormal">           "Table isn't big enough!");<o:p></o:p></p>
<p class="MsoNormal">    LegalizeAction Action = (LegalizeAction)<o:p></o:p></p>
<p class="MsoNormal">      ((CondCodeActions[CC][VT.getSimpleVT().SimpleTy >> 5] >> (2*(VT.getSimpleVT().SimpleTy - 32))) & 3);<o:p></o:p></p>
<p class="MsoNormal">    assert(Action != Promote && "Can't promote condition code!");<o:p></o:p></p>
<p class="MsoNormal">    return Action;<o:p></o:p></p>
<p class="MsoNormal">  }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The other options are to use a BitVector, or to have a different array for each Legalized action. This approach however seems to use the minimum amount of memory/instructions.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Ideas?<o:p></o:p></p>
<p class="MsoNormal">Micah<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> llvmdev-bounces@cs.uiuc.edu [mailto:llvmdev-bounces@cs.uiuc.edu]
<b>On Behalf Of </b>Villmow, Micah<br>
<b>Sent:</b> Thursday, July 26, 2012 11:29 AM<br>
<b>To:</b> Developers Mailing List<br>
<b>Subject:</b> [LLVMdev] Why is this assertion here?<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I'm trying to understand why this assertion is here.<o:p></o:p></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">LegalizeAction<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">  getCondCodeAction(ISD::CondCode CC, EVT VT)
<span style="color:blue">const</span> {<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">    assert((<span style="color:blue">unsigned</span>)CC < array_lengthof(CondCodeActions) &&<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">           (<span style="color:blue">unsigned</span>)VT.getSimpleVT().SimpleTy <
<span style="color:blue">sizeof</span>(CondCodeActions[0])*4 &&<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">          
<span style="color:#A31515">"Table isn't big enough!"</span>);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">    LegalizeAction Action = (LegalizeAction)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">      ((CondCodeActions[CC] >> (2*VT.getSimpleVT().SimpleTy)) & 3);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">    assert(Action != Promote &&
<span style="color:#A31515">"Can't promote condition code!"</span>);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">   
<span style="color:blue">return</span> Action;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">  }<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">The first part of the assertion I can understand, but why is there an assertion<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">that there are only 32 types? in TOT LLVM if this code is called with v8f32,v2f64<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">or v4f64, this assert is triggered.<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">Shouldn't the assert be:<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">(<span style="color:blue">unsigned</span>)VT.getSimpleVT().SimpleTy <
<span style="color:blue">MVT::MAX_ALLOWED_VALUETYPE</span> &&<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">or<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">(<span style="color:blue">unsigned</span>)VT.getSimpleVT().SimpleTy <
<span style="color:blue">MVT::LAST_VECTOR_VALUETYPE</span> &&<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">?<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">Thanks,<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas">Micah<o:p></o:p></span></p>
<p class="MsoNormal" style="text-autospace:none"><span style="font-size:9.5pt;font-family:Consolas"><o:p> </o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</body>
</html>