<div dir="ltr"><div><div><div>I don't think that the patterns that I'm currently looking at will overlap with min/max and friends.<br><br></div>So far we're proposing to increase selects in instcombine, and we go out of our way to avoid breaking icmp+select pairs (which seems questionable...):<br><br>  // Test if the ICmpInst instruction is used exclusively by a select as<br>  // part of a minimum or maximum operation. If so, refrain from doing<br>  // any other folding. This helps out other analyses which understand<br>  // non-obfuscated minimum and maximum idioms, such as ScalarEvolution<br>  // and CodeGen.<br><br></div>Once you get to the DAG, there's more support for min/max at least because we have various generic and target-specific nodes for those. But again, if we pessimize some codegen with a new fold, it should be considered a bug.<br><br></div>Note that select lowering in the DAG doesn't work ideally right now, so I think we need to fix that before producing more selects in IR:<br><div><div><a href="https://llvm.org/bugs/show_bug.cgi?id=28925">https://llvm.org/bugs/show_bug.cgi?id=28925</a><br></div></div><div class="gmail_extra"><a href="https://llvm.org/bugs/show_bug.cgi?id=28968">https://llvm.org/bugs/show_bug.cgi?id=28968</a><br><a href="https://llvm.org/bugs/show_bug.cgi?id=30327#c2">https://llvm.org/bugs/show_bug.cgi?id=30327#c2</a><br><br><br><div class="gmail_quote">On Thu, Sep 29, 2016 at 12:34 PM, Rackover, Zvi <span dir="ltr"><<a target="_blank" href="mailto:zvi.rackover@intel.com">zvi.rackover@intel.com</a>></span> wrote:<br><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex" class="gmail_quote">





<div lang="EN-US">
<div>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif;color:rgb(31,73,125)">Hi Sanjay,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif;color:rgb(31,73,125)">Hi Hal,<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class="MsoNormal"><a name="m_-914764658319334731__MailEndCompose"><span style="font-size:11pt;font-family:"calibri",sans-serif;color:rgb(31,73,125)">Question about:<u></u><u></u></span></a></p>
<p class="MsoNormal">>… and canonicalize toward bool math in the DAG. I don't know of any target that does better lowering the select variants.<span style="font-size:11pt;font-family:"calibri",sans-serif;color:rgb(31,73,125)"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif;color:rgb(31,73,125)"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif;color:rgb(31,73,125)">What about recognition of idioms that may be considered to be naturally composed of ‘select’ operations such as: min/max/saturate/clamp. Will this change impact
 the target’s ability (or make it more difficult) to recognize these idioms?<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif;color:rgb(31,73,125)">Thanks, Zvi<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:"calibri",sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class="MsoNormal"><a name="m_-914764658319334731______replyseparator"></a><b><span style="font-size:11pt;font-family:"calibri",sans-serif">From:</span></b><span style="font-size:11pt;font-family:"calibri",sans-serif"> llvm-dev [mailto:<a target="_blank" href="mailto:llvm-dev-bounces@lists.llvm.org">llvm-dev-bounces@<wbr>lists.llvm.org</a>]
<b>On Behalf Of </b>Sanjay Patel via llvm-dev<br>
<b>Sent:</b> Thursday, September 29, 2016 19:20<br>
<b>To:</b> Sanjoy Das <<a target="_blank" href="mailto:sanjoy@playingwithpointers.com">sanjoy@playingwithpointers.<wbr>com</a>><br>
<b>Cc:</b> llvm-dev <<a target="_blank" href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>><br>
<b>Subject:</b> Re: [llvm-dev] IR canonicalization: select or bool math?<u></u><u></u></span></p>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<div>
<div>
<div>
<div><span class="gmail-">
<div>
<div>
<p style="margin-bottom:12pt" class="MsoNormal">I hadn't thought about the no-wrap consequences. That does seem like a good argument to always favor select since propagating nsw/nuw correctly is a weak point as I understand it. It would also make the instcombine
 behavior more consistent despite the fact that, as Chris points out, zext/sext are acknowledged as simpler ops.<u></u><u></u></p>
</div>
<p style="margin-bottom:12pt" class="MsoNormal">Sadly (for me anyway since I want to clean this up!) this means, as Hal noted: in general we want to canonicalize toward select in IR, and canonicalize toward bool math in the DAG. I don't know of any target
 that does better lowering the select variants. In some cases today, we even create control flow where there was none in the original code when we transform bool math into select in IR. Prejudiced by that knowledge, I've been enhancing IR transforms that effectively
 assume that 2 cheap IR ops (ext+add/sub) are more canonical than 1 select.<u></u><u></u></p>
</div>
</span><p class="MsoNormal"><span class="gmail-">So a proposal to move this forward:<br></span>
1. Add DAG combines (possibly with TLI hooks) to turn selects into bool math. This will be a translation of existing IR select instcombines + new transforms. We ca<span style="color:rgb(31,73,125)">dc</span>n't knowingly create IR patterns that the backend is not
 prepped to handle.<u></u><u></u></p>
</div><div><div class="gmail-h5">
<p class="MsoNormal">2. Remove existing IR instcombines that remove selects in favor of bool math.<u></u><u></u></p>
</div></div></div><div><div class="gmail-h5">
<p style="margin-bottom:12pt" class="MsoNormal">3. Add IR instcombines to transform bool math into selects.<u></u><u></u></p>
</div></div></div><div><div class="gmail-h5">
<p class="MsoNormal">Here are the quiz answers based on current trunk - if you did actually try to compile the code, sorry about all of the typos that made that impossible! :<u></u><u></u></p>
</div></div></div><div><div class="gmail-h5">
<p class="MsoNormal">#1 - 4 are canonicalized to bool math. Ie, we don't care about the relative cost of sext vs. zext or if the transform needs an extra instruction (the 'not') for these cases.<u></u><u></u></p>
<div>
<div>
<div>
<p class="MsoNormal">#5 is canonicalized to select.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">#6 is not canonicalized either way; 5/6 were introduced together as you might expect, but 6 was backed out due to lousy codegen!<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">#7 is not canonicalized either way; too rare to care about?<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">#8 is not canonicalized either way; this one is fun because it exists in the instcombine source code itself - and we do a lousy job with it.<u></u><u></u></p>
</div>
<div>
<div>
<div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
</div>
</div>
</div>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">On Wed, Sep 28, 2016 at 11:12 PM, Sanjoy Das <<a target="_blank" href="mailto:sanjoy@playingwithpointers.com">sanjoy@playingwithpointers.<wbr>com</a>> wrote:<u></u><u></u></p>
<blockquote style="border-width:medium medium medium 1pt;border-style:none none none solid;border-color:-moz-use-text-color -moz-use-text-color -moz-use-text-color rgb(204,204,204);padding:0cm 0cm 0cm 6pt;margin-left:4.8pt;margin-right:0cm">
<p class="MsoNormal">My gut tells me that Hal is right, and we should prefer zexts as long<br>
as the select boils down to one instruction, but let me go against my<br>
intuition and try to list two reasons why we should prefer selects:<br>
<br>
 * Folding operations into selects: it is trivial to transform<br>
   f(select X, Const0, Const1) to select X, f(Const0), f(Const1),<br>
   while doing that can be difficult for zexts.<br>
<br>
   define i32 @sel_1_or_0(i1 %a) {<br>
     %b = select i1 %a, i32 1, i32 0<br>
     %k = add i32 %b, 50<br>
     ret i32 %k<br>
   }<br>
<br>
   ==><br>
<br>
   define i32 @sel_1_or_0(i1 %a) {<br>
     %b = select i1 %a, i32 51, i32 50<br>
     ret i32 %b<br>
   }<br>
<br>
   but<br>
<br>
   define i32 @sel_1_or_0(i1 %a) {<br>
     %b = zext i1 %a to i32<br>
     %k = add i32 %b, 50<br>
     ret i32 %k<br>
   }<br>
<br>
   is not as natural to transform.<br>
<br>
 * zexts (resp. sexts) lose information when combined with nuw<br>
   (resp. nsw) operations.<br>
<br>
   That is, if we inline<br>
<br>
   define i32 @sel_1_or_0(i1 %a) {<br>
     %b = zext i1 %a to i32<br>
     ret i32 %b<br>
   }<br>
<br>
   into f and get<br>
<br>
   define i32 @f(i32 %x, i32 %y) {<br>
     %x.zext = ...<br>
     %y.zext = ...<br>
     ;; There are some existing use of %x.zext and %y.zext<br>
     %a = add nuw i1 %x, %y<br>
     %b = zext i1 %a to i32<br>
     ret i32 %b<br>
   }<br>
<br>
   then we'll get (following your instructions, I've not verified that<br>
   this actually happens :) )<br>
<br>
   define i32 @f(i1 %x, i1 %y) {<br>
     %x.zext = ...<br>
     %y.zext = ...<br>
     %a = add nuw i32 %x.zext, %y.zext<br>
     ret i32 %a<br>
   }<br>
<br>
   but we've now lost information -- we no longer know that %a is 0 or<br>
   1 -- it can also be 2.  This would not happen if we always<br>
   canonicalized zext i1 C to iN to select C, iN 1, iN 0<span style="color:rgb(136,136,136)"><br>
<br>
-- Sanjoy</span><u></u><u></u></p>
</blockquote>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div></div></div>
</div>
<p>------------------------------<wbr>------------------------------<wbr>---------<br>
Intel Israel (74) Limited</p>

<p>This e-mail and any attachments may contain confidential material for<br>
the sole use of the intended recipient(s). Any review or distribution<br>
by others is strictly prohibited. If you are not the intended<br>
recipient, please contact the sender and delete all copies.</p></div>

</blockquote></div><br></div></div>