<div dir="ltr"><div><div><div><div>The examples and table are great! That at least makes it clear what we need to think about and fix (and just how complex the problem is). <br><br>Are there known limitations/objections to the freeze instruction patches that John listed? Or are we just being cautious and/or waiting for more people to review those?<br><br></div>I can answer some of the DAG questions: <br>(a) Yes, we have nsw/nuw/exact down there. They've been around since: <a href="https://reviews.llvm.org/rL210467">https://reviews.llvm.org/rL210467</a> .<br></div>(b) Yes, we use those bits to enable transforms, but it's not nearly as common as in IR. It's also likely that we'll drop those bits during transforms.<br></div>(c) Yes, we do all kinds of select transforms without regard for poison.<br></div>(d) AFAIK, there is no accounting for poison in the DAG for any transforms, but it's possible that I just didn't find it in the source.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, May 23, 2017 at 4:16 AM, Nuno Lopes <span dir="ltr"><<a href="mailto:nuno.lopes@ist.utl.pt" target="_blank">nuno.lopes@ist.utl.pt</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div link="#0563C1" vlink="#954F72" lang="EN-US"><div class="m_-6971828876095942576WordSection1"><p class="m_-6971828876095942576MsoPlainText">Hi,<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">Let me try to give a bit more context on why select is so tricky.<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">First thing to consider is which transformations we would like to support:<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText"><u>1) Control-flow -> select (SimplifyCFG)<u></u><u></u></u></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">if (c)<u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas"> a = x<u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">else<u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas"> a = y<u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas"><u></u> <u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">  =><u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">%a = select %c, %x, %y<u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText"><u>2) select -> control-flow</u>; reverse of 1)<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">Not sure if this is done at IR level, or only later at SDAG.<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText"><u>3) select -> arithmetic<u></u><u></u></u></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">%a = select %c, true, %y<u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">  =><u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">%a = or %c, %y<u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText"><u>4) select removal<u></u><u></u></u></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">%c = icmp eq %x, C<u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">%r = select %c, C, %x<u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">  =><u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">%r = %x<u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span lang="PT"><u></u> <u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span lang="PT"><u></u> <u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><u><span lang="PT">5) select hoisting past binops<u></u><u></u></span></u></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">%a = udiv %x, %y<u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">%b = udiv %x, %z<u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">%r = select %c, %a, %b<u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">  =><u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">%t = select %c, %y, %z<u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><span style="font-size:10.0pt;font-family:Consolas">%r = udiv %x, %t<u></u><u></u></span></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText"><u>6) Bonus: easy to move</u> select instructions around. Should be possible to hoist selects out of loops easily.<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">Ideally we want semantics for select that allow all transformations 1-6. It's hard because:<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">1) %a can only be poison conditionally on %c, i.e., %a is poison if %c=true and %x is poison, or %c=false and %y is poison<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">2) since we introduce a branch on %c, select on poison has to be UB like branch on poison<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">3) with arithmetic all operands are always evaluated, so conditional poison like in 1) doesn’t work<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">4) the example provided replaces C with %x in case %x=C. C is never poison, but %x might be.<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">5) We cannot introduce a division by poison if %y and %z are not poison<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">6) Making select trigger UB for some cases makes movement harder because then we need to prove that it won’t trigger UB before e.g. hoisting it out of loops.<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">Summary table of what each transformation allows for %z = select %c, %x, %y. Each column is a different alternative of semantics for select:<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><table class="m_-6971828876095942576MsoTableGrid" style="border-collapse:collapse;border:none" cellspacing="0" cellpadding="0" border="1"><tbody><tr><td style="width:105.95pt;border:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="141" valign="top"><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p></td><td style="width:81.05pt;border:solid windowtext 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt" width="108" valign="top"><p class="m_-6971828876095942576MsoPlainText">UB if %c poison<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">+ conditional poison<u></u><u></u></p></td><td style="width:96.1pt;border:solid windowtext 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt" width="128" valign="top"><p class="m_-6971828876095942576MsoPlainText">UB if %c poison + poison if either<br>%x/%y poison<u></u><u></u></p></td><td style="width:96.1pt;border:solid windowtext 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt" width="128" valign="top"><p class="m_-6971828876095942576MsoPlainText">Conditional poison<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"> + non-det choice if %c poison<u></u><u></u></p></td><td style="width:99.25pt;border:solid windowtext 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt" width="132" valign="top"><p class="m_-6971828876095942576MsoPlainText">Conditional poison + poison if %c poison**<u></u><u></u></p></td><td style="width:4.0cm;border:solid windowtext 1.0pt;border-left:none;padding:0cm 5.4pt 0cm 5.4pt" width="151" valign="top"><p class="m_-6971828876095942576MsoPlainText">Poison if any of<br>%c/%x/%y are poison<u></u><u></u></p></td></tr><tr><td style="width:105.95pt;border:solid windowtext 1.0pt;border-top:none;padding:0cm 5.4pt 0cm 5.4pt" width="141" valign="top"><p class="m_-6971828876095942576MsoPlainText">SimplifyCFG<u></u><u></u></p></td><td style="width:81.05pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="108" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td><td style="width:96.1pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="128" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><u></u> <u></u></p></td><td style="width:96.1pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="128" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td><td style="width:99.25pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="132" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td><td style="width:4.0cm;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="151" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><u></u> <u></u></p></td></tr><tr><td style="width:105.95pt;border:solid windowtext 1.0pt;border-top:none;padding:0cm 5.4pt 0cm 5.4pt" width="141" valign="top"><p class="m_-6971828876095942576MsoPlainText">Select->control-flow<u></u><u></u></p></td><td style="width:81.05pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="108" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td><td style="width:96.1pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="128" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td><td style="width:96.1pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="128" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><u></u> <u></u></p></td><td style="width:99.25pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="132" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><u></u> <u></u></p></td><td style="width:4.0cm;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="151" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><u></u> <u></u></p></td></tr><tr><td style="width:105.95pt;border:solid windowtext 1.0pt;border-top:none;padding:0cm 5.4pt 0cm 5.4pt" width="141" valign="top"><p class="m_-6971828876095942576MsoPlainText">Select->arithmetic<u></u><u></u></p></td><td style="width:81.05pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="108" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><u></u> <u></u></p></td><td style="width:96.1pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="128" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td><td style="width:96.1pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="128" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><u></u> <u></u></p></td><td style="width:99.25pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="132" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><u></u> <u></u></p></td><td style="width:4.0cm;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="151" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td></tr><tr><td style="width:105.95pt;border:solid windowtext 1.0pt;border-top:none;padding:0cm 5.4pt 0cm 5.4pt" width="141" valign="top"><p class="m_-6971828876095942576MsoPlainText">Select removal<u></u><u></u></p></td><td style="width:81.05pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="108" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td><td style="width:96.1pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="128" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td><td style="width:96.1pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="128" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><u></u> <u></u></p></td><td style="width:99.25pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="132" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td><td style="width:4.0cm;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="151" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td></tr><tr><td style="width:105.95pt;border:solid windowtext 1.0pt;border-top:none;padding:0cm 5.4pt 0cm 5.4pt" width="141" valign="top"><p class="m_-6971828876095942576MsoPlainText">Select hoist<u></u><u></u></p></td><td style="width:81.05pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="108" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td><td style="width:96.1pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="128" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td><td style="width:96.1pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="128" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td><td style="width:99.25pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="132" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><u></u> <u></u></p></td><td style="width:4.0cm;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="151" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><u></u> <u></u></p></td></tr><tr><td style="width:105.95pt;border:solid windowtext 1.0pt;border-top:none;padding:0cm 5.4pt 0cm 5.4pt" width="141" valign="top"><p class="m_-6971828876095942576MsoPlainText">Easy movement<u></u><u></u></p></td><td style="width:81.05pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="108" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><u></u> <u></u></p></td><td style="width:96.1pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="128" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><u></u> <u></u></p></td><td style="width:96.1pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="128" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td><td style="width:99.25pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="132" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td><td style="width:4.0cm;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 5.4pt 0cm 5.4pt" width="151" valign="top"><p class="m_-6971828876095942576MsoPlainText" style="text-align:center" align="center"><span style="font-family:"Segoe UI Symbol",sans-serif">✓</span><u></u><u></u></p></td></tr></tbody></table><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">Modulo bugs in the table, you can see there’s no single column with all rows with a <span style="font-family:"Segoe UI Symbol",sans-serif">✓</span>.  That means there’s no way (that I’m aware of) to make all transformations that we are interested in doing to be correct.  A solution is to introduce something like the freeze instruction that can land a <span style="font-family:"Segoe UI Symbol",sans-serif">✓</span> on any cell you want.<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">So unless someone has a clever idea and proposes a new column that has ticks in all rows, we are left with picking a trade-off: either we disable some optimizations, or we introduce something like freeze to continue doing them.<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">BTW, this table assumes that branch on poison is UB, otherwise optimizations like GVN are wrong (for more details see our paper: <a href="http://www.cs.utah.edu/~regehr/papers/undef-pldi17.pdf" target="_blank">http://www.cs.utah.edu/~<wbr>regehr/papers/undef-pldi17.pdf</a><wbr>). The column marked with ** is the one that Alive currently implements.<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">Regarding SDAG: it has undef, and I believe there was some discussion regarding introducing poison there as well. I don’t recall if it was introduce already, but I believe there’s already nsw/nuw there. If that’s the case, the (il)legality of transformations should be exactly the same as in LLVM IR.  Otherwise some transformations may be easier.<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">Sorry for the longish email; just wanted to give some background about the problem so that we can reach some consensus at some point.<span class="HOEnZb"><font color="#888888"><u></u><u></u></font></span></p><span class="HOEnZb"><font color="#888888"><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">Nuno<u></u><u></u></p></font></span><div><div class="h5"><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">-----Original Message-----<br>From: John Regehr<br>Sent: 22 de maio de 2017 21:45<br>Subject: Re: [poison] is select-of-select to logic+select allowed?</p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">Nuno and I have been looking through the results of experiments like the one reported here:<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">   <a href="https://blog.regehr.org/archives/1510" target="_blank"><span style="color:windowtext;text-decoration:none">https://blog.regehr.org/<wbr>archives/1510</span></a><u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">Indeed there are some select-related transformations in LLVM that are illegal in terms of Alive's semantics. As far as we know, they cannot be made legal (by adjusting the semantics of instructions) without breaking a bunch of other optimizations.<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">The optimizations currently in LLVM are not only inconsistent but they can lead to end-to-end miscompilations. Sorting this out is going to require (1) figuring out what select means WRT poison/undef and (2) backing out some optimizations. This is going to be slightly painful but it is the only way forward.<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">John<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText"><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">On 5/22/17 2:32 PM, Sanjay Patel wrote:<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">> Some InstCombine transforms for select-of-select were added here:<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">> <a href="https://reviews.llvm.org/rL228409" target="_blank"><span style="color:windowtext;text-decoration:none">https://reviews.llvm.org/<wbr>rL228409</span></a><u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">> But Alive says this is more poisonous:<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">> Name: selsel<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">> %s1 = select i1 %cond1, i8 C1, i8 C2<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">> %s2 = select i1 %cond2, i8 %s1, i8 C2<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">>   =><u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">> %andcond = and i1 %cond1, %cond2<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">> %s2 = select i1 %andcond, i8 C1, i8 C2<u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">> <a href="http://rise4fun.com/Alive/JT6" target="_blank"><span style="color:windowtext;text-decoration:none">http://rise4fun.com/Alive/JT6</span></a><u></u><u></u></p><p class="m_-6971828876095942576MsoPlainText">><u></u> <u></u></p><p class="m_-6971828876095942576MsoPlainText">> Are those transforms legal?<u></u><u></u></p></div></div></div></div></blockquote></div><br></div>