<div dir="ltr"><div dir="ltr">On Thu, Jun 27, 2019 at 12:18 PM Nick Desaulniers via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">+ CBL mailing list<br><div>On Thu, Jun 27, 2019 at 11:08 AM Bill Wendling <<a href="mailto:isanbard@gmail.com" target="_blank">isanbard@gmail.com</a>> wrote:<br></div></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">[Adding the correct cfe-dev mailing list address.]</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Jun 27, 2019 at 11:06 AM Bill Wendling <<a href="mailto:isanbard@gmail.com" target="_blank">isanbard@gmail.com</a>> wrote:</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><span id="gmail-m_-9076295438729906844gmail-m_7315644313067770944gmail-m_-6035809721782067189gmail-docs-internal-guid-90f5d1f9-7fff-5d14-b18e-9466b93bf7e4"><div dir="ltr" style="margin-left:0pt" align="left"><table style="border:none;border-collapse:collapse"><colgroup></colgroup><tbody><tr style="height:0pt"><td style="vertical-align:top;background-color:rgb(248,248,248);padding:5pt;overflow:hidden"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><source>:</span><span style="font-family:Consolas,sans-serif;color:rgb(0,128,128);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">2</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">:</span><span style="font-family:Consolas,sans-serif;color:rgb(0,128,128);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">30</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">: </span><span style="font-family:Consolas,sans-serif;color:rgb(0,134,179);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">error</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">: 'asm </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">goto</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">' cannot have </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">output</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> constraints</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br></span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">  asm </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">goto</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">(</span><span style="font-family:Consolas,sans-serif;color:rgb(221,17,68);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">"poetry %0, %1"</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> : </span><span style="font-family:Consolas,sans-serif;color:rgb(221,17,68);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">"=r"</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">(a), </span><span style="font-family:Consolas,sans-serif;color:rgb(221,17,68);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">"=r"</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">(b) : : : </span><span style="font-family:Consolas,sans-serif;color:rgb(0,134,179);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">error</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">);</span></p></td></tr></tbody></table></div><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-family:Arial;color:rgb(0,0,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">However, LLVM doesn't restrict control transfer instructions from having outputs (e.g. the </span><a href="https://llvm.org/docs/LangRef.html#invoke-instruction" style="text-decoration-line:none" target="_blank"><span style="font-family:"Roboto Mono",monospace;font-variant-numeric:normal;font-variant-east-asian:normal;text-decoration-line:underline;vertical-align:baseline;white-space:pre-wrap">invoke</span><span style="font-family:Arial;font-variant-numeric:normal;font-variant-east-asian:normal;text-decoration-line:underline;vertical-align:baseline;white-space:pre-wrap"> instruction</span></a><span style="font-family:Arial;color:rgb(0,0,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">). We propose changing LLVM's </span><a href="https://llvm.org/docs/LangRef.html#callbr-instruction" style="text-decoration-line:none" target="_blank"><span style="font-family:"Roboto Mono",monospace;font-variant-numeric:normal;font-variant-east-asian:normal;text-decoration-line:underline;vertical-align:baseline;white-space:pre-wrap">callbr</span><span style="font-family:Arial;font-variant-numeric:normal;font-variant-east-asian:normal;text-decoration-line:underline;vertical-align:baseline;white-space:pre-wrap"> instruction</span></a><span style="font-family:Arial;color:rgb(0,0,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> to allow return values, similar to how LLVM's implementation of inline assembly (via the </span><a href="https://llvm.org/docs/LangRef.html#call-instruction" style="text-decoration-line:none" target="_blank"><span style="font-family:"Roboto Mono",monospace;font-variant-numeric:normal;font-variant-east-asian:normal;text-decoration-line:underline;vertical-align:baseline;white-space:pre-wrap">call</span><span style="font-family:Arial;font-variant-numeric:normal;font-variant-east-asian:normal;text-decoration-line:underline;vertical-align:baseline;white-space:pre-wrap"> instruction</span></a><span style="font-family:Arial;color:rgb(0,0,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">) allows return values. Since there can potentially be zero to many output constraints, </span><span style="font-family:"Roboto Mono",monospace;color:rgb(0,0,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">callbr</span><span style="font-family:Arial;color:rgb(0,0,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> would now return an aggregate which contains an element for each output constraint.  These values would then be extracted via </span><span style="font-family:"Roboto Mono",monospace;color:rgb(0,0,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">extractvalue</span><span style="font-family:Arial;color:rgb(0,0,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">. With our proposal, the above C example will be converted to LLVM IR like this:</span></p><br><div dir="ltr" style="margin-left:0pt" align="left"><table style="border:none;border-collapse:collapse"><colgroup></colgroup><tbody><tr style="height:0pt"><td style="vertical-align:top;background-color:rgb(248,248,248);padding:5pt;overflow:hidden"><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">define</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">i32</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-family:Consolas,sans-serif;color:rgb(153,0,0);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">@vogon</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">(</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">i32</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-family:Consolas,sans-serif;color:rgb(153,0,115);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">%a</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">, </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">i32</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-family:Consolas,sans-serif;color:rgb(153,0,115);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">%b</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">) {</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br></span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">entry:</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br></span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-family:Consolas,sans-serif;color:rgb(153,0,115);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">%0</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> = callbr { </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">i32</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">, </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">i32</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> } </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">asm</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">sideeffect</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-family:Consolas,sans-serif;color:rgb(221,17,68);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">"poetry $0, $1"</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">, </span><span style="font-family:Consolas,sans-serif;color:rgb(221,17,68);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">"=r,=r,X"</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br></span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">      (</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">i8</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">* </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">blockaddress</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">(</span><span style="font-family:Consolas,sans-serif;color:rgb(153,0,0);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">@vogon</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">, </span><span style="font-family:Consolas,sans-serif;color:rgb(153,0,115);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">%error</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">))</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br></span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">          </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">to</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> label </span><span style="font-family:Consolas,sans-serif;color:rgb(153,0,115);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">%asm.fallthrough</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> [label </span><span style="font-family:Consolas,sans-serif;color:rgb(153,0,115);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">%error</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">]</span></p><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br></span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">asm</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">.fallthrough:</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br></span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-family:Consolas,sans-serif;color:rgb(153,0,115);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">%asmresult.a</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> = </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">extractvalue</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> { </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">i32</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">, </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">i32</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> } </span><span style="font-family:Consolas,sans-serif;color:rgb(153,0,115);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">%0</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">, </span><span style="font-family:Consolas,sans-serif;color:rgb(0,128,128);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">0</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br></span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-family:Consolas,sans-serif;color:rgb(153,0,115);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">%asmresult.b</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> = </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">extractvalue</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> { </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">i32</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">, </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">i32</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> } </span><span style="font-family:Consolas,sans-serif;color:rgb(153,0,115);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">%0</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">, </span><span style="font-family:Consolas,sans-serif;color:rgb(0,128,128);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">1</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br></span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-family:Consolas,sans-serif;color:rgb(153,0,115);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">%result</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> = </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">add</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">i32</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-family:Consolas,sans-serif;color:rgb(153,0,115);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">%asmresult.a</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">, </span><span style="font-family:Consolas,sans-serif;color:rgb(153,0,115);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">%asmresult.b</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br></span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">ret</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">i32</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-family:Consolas,sans-serif;color:rgb(153,0,115);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">%result</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br></span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br></span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">error:</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br></span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">  </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">ret</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-weight:700;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">i32</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> </span><span style="font-family:Consolas,sans-serif;color:rgb(0,128,128);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">-1</span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"><br></span><span style="font-family:Consolas,sans-serif;color:rgb(51,51,51);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">}</span></p></td></tr></tbody></table></div><br><p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt"><span style="font-family:Arial;color:rgb(0,0,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">Note that unlike the </span><span style="font-family:"Roboto Mono",monospace;color:rgb(0,0,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">invoke</span><span style="font-family:Arial;color:rgb(0,0,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> instruction, </span><span style="font-family:"Roboto Mono",monospace;color:rgb(0,0,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">callbr</span><span style="font-family:Arial;color:rgb(0,0,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">'s return values are assumed valid on </span><span style="font-family:Arial;color:rgb(0,0,0);font-style:italic;font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap">all</span><span style="font-family:Arial;color:rgb(0,0,0);font-variant-numeric:normal;font-variant-east-asian:normal;vertical-align:baseline;white-space:pre-wrap"> branches. The assumption is that the programmer knows what their inline assembly is doing and where its output constraints are valid. If the value isn't valid on a particular branch but is used there anyway, then the result is a poison value. (Also, </span><span style="font-variant-numeric:normal;font-variant-east-asian:normal;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap">if a </span><span style="font-variant-numeric:normal;font-variant-east-asian:normal;font-family:"Roboto Mono",monospace;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap">callbr</span><span style="font-variant-numeric:normal;font-variant-east-asian:normal;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap">'s return values affect a branch, it will be handled similarly to the </span><span style="font-variant-numeric:normal;font-variant-east-asian:normal;font-family:"Roboto Mono",monospace;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap">invoke</span><span style="font-variant-numeric:normal;font-variant-east-asian:normal;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap"> instruction's implementation.) Here's an example of how this would work:</span></p></span></div></blockquote></div></blockquote></div></blockquote><div><br></div><div>Generally, I'd prefer if we didn't keep designing new features that assume the programmer knows what they're doing. Personally, I had been considering reworking LLVM's Windows EH representation to eliminate the catchswith instruction, which just exists to multiplex invoke unwind edges to multiple catch blocks. Instead, we'd use callbr, and I had been assuming it would have the normal behavior of producing the return value only along the normal path.</div><div><br></div><div>Do you think landingpad offers alternative inspiration for how to handle this? i.e. you could have a special EHPad-like instruction (must be first non-PHI instruction) that produces a value along abnormal paths.</div></div></div>