<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Thanks for sharing this! Quite interesting questions indeed :)<div class=""><br class=""></div><div class="">I regret that we don’t have any documentation (on the same level as LangRef) that would record and describe the canonicalization of the IR and the motivation for each case.</div><div class=""><br class=""></div><div class="">—</div><div class="">Mehdi<br class=""><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Sep 28, 2016, at 3:39 PM, Sanjay Patel via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class=""><div class=""><div class="">I have another round of questions about IR select canonicalizations. For the purity of this quiz, please disregard prior knowledge of how this is handled by instcombine or how this is lowered by your favorite target...of course we'll fix it. :) Some answers in the links below if you do want to know.<br class=""></div></div><div class=""><br class=""></div>Which, if any, of these is canonical?<br class=""> <br class=""></div><div class=""><span style="font-family:monospace,monospace" class="">1. Is a zext simpler than a select?<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">a. define i32 @sel_1_or_0(i1 %a) {<br class="">  %b = select i1 %a, i32 1, i32 0<br class="">  ret i32 %b<br class="">}<br class=""><br class=""></span></div><span style="font-family:monospace,monospace" class="">b. define i32 @sel_1_or_0(i1 %a) {<br class=""></span><div class=""><span style="font-family:monospace,monospace" class="">  %b = zext i1 %a to i32<br class="">  ret i32 %b<br class="">}<br class=""><br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">2. What if we have to 'not' the bool?<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">a. define i32 @sel_0_or_1(i1 %a) {<br class="">  %b = select i1 %a, i32 0, i32 1<br class="">  ret i32 %b<br class="">}<br class=""><br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">b. define i32 @sel_0_or_1(i1 %a) {<br class="">  %not.a = xor i1 %a, true<br class="">  %b = zext i1 %not.a to i32<br class="">  ret i32 %b<br class="">}<br class=""><br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">3. Is sext handled differently?<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">a. define i32 @sel_-1_or_0(i1 %a) {<br class="">  %b = select i1 %a, i32 -1, i32 0<br class="">  ret i32 %b<br class="">}<br class=""><br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">b. define i32 @sel_-1_or_0(i1 %a) {<br class="">  %b = sext i1 %a to i32<br class="">  ret i32 %b<br class="">}<br class=""><br class="">4. What if the sext needs a 'not'?<br class="">a. define i32 @sel_0_or_-1(i1 %a) {<br class="">  %b = select i1 %a, i32 0, i32 -1<br class="">  ret i32 %b<br class="">}<br class=""><br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">b. define i32 @sel_0_or_-1(i1 %a) {<br class="">  %not.a = xor i1 %a, true<br class="">  %b = sext i1 %not.a to i32<br class="">  ret i32 %b<br class="">}<br class=""><br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">5. What if both constants are non-zero? Ie, the implicit add/sub of the earlier cases can't be eliminated.<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">a. define i32 @sel_2_or_1(i1 %a) {<br class="">  %b = select i1 %a, i32 2, i32 1<br class="">  ret i32 %b<br class="">}<br class=""><br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">b. define i32 @sel_2_or_1(i1 %a) {<br class="">  %b = zext i1 to i32 %a<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">  %c = add i32 %b, 1<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">  ret i32 %b<br class="">}<br class=""><br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">6. Does 'sub' make a difference?<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">a. define i32 @sel_1_or_2(i1 %a) {<br class="">  %b = select i1 %a, i32 1, i32 2<br class="">  ret i32 %b<br class="">}<br class=""><br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">b. define i32 @sel_1_or_2(i1 %a) {<br class="">  %b = zext i1 %a to i32<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">  %c = sub i32 2, %b<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">  ret i32 %c<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">}<br class=""><br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">7. Choose between integers that are not consecutive?<br class=""></span><div class=""><span style="font-family:monospace,monospace" class="">a. define i32 @sel_0_or_2(i1 %a) {<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">  %sel = select i1 %a, i32 2, i32 0<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">  ret i32 %sel2<br class="">}<br class=""><br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">b. define i32 @sel_0_or_2(i1 %a) {<br class=""></span><div class=""><span style="font-family:monospace,monospace" class="">  %zexta = zext i1 %a to i32<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">  %add = add i32 %zexta, %zexta<br class=""></span></div><span style="font-family:monospace,monospace" class="">  ret i32 %add<br class="">}<br class=""><br class=""></span></div></div><div class=""><span style="font-family:monospace,monospace" class="">8. Choose {0,1,2} based on 2 bools?<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">a. define i32 @sel_sel(i1 %a, i1 %b) {<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">  %zexta = zext i1 %a to i32<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">  %sel1 = select i1 %a, i32 2, i32 1<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">  %sel2 = select i1 %b, i32 %sel1, %zexta<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">  ret i32 %sel2<br class="">}<br class=""><br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">b. define i32 @sel_sel(i1 %a, i1 %b) {<br class=""></span><div class=""><span style="font-family:monospace,monospace" class="">  %zexta = zext i1 %a to i32<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">  %zextb = zext i1 %b to i32<br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">  %add = add i32 %zexta, %zextb<br class=""></span></div><span style="font-family:monospace,monospace" class="">  ret i32 %add<br class="">}<br class=""><br class=""></span></div><div class=""><span style="font-family:monospace,monospace" class="">Links for reference:<br class=""><a href="https://llvm.org/bugs/show_bug.cgi?id=30273" class="">https://llvm.org/bugs/show_bug.cgi?id=30273</a><br class=""><a href="https://llvm.org/bugs/show_bug.cgi?id=30327" class="">https://llvm.org/bugs/show_bug.cgi?id=30327</a><br class=""><a href="https://reviews.llvm.org/D24480" class="">https://reviews.llvm.org/D24480</a><br class=""></span><br class=""></div><div class=""><pre id="gmail-comment_text_0" class="gmail-bz_comment_text"></pre></div></div>
_______________________________________________<br class="">LLVM Developers mailing list<br class=""><a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a><br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev<br class=""></div></blockquote></div><br class=""></div></div></body></html>