<div dir="ltr">The LLVM-IR says that udiv by zero is undefined behavior.<div><br></div><div>So, I believe if trap on divide by zero is a required behavior then it has to be tested before in a different way.</div><div>Which would make my transformation ok?</div><div><br></div><div><span style="color:rgb(0,0,0);background-color:rgb(255,255,254)">Clang adds sanitation check before trying the udiv when compiled with -fsanitize=undefined :</span><br></div><div><br></div><div><div style="color:rgb(0,0,0);background-color:rgb(255,255,254)"><div><span style="color:rgb(0,0,255)">define</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(0,128,128)">@foo</span>(<span style="color:rgb(0,128,128)">i32</span>, <span style="color:rgb(0,128,128)">i32</span>) <span style="color:rgb(0,128,128)">local_unnamed_addr</span> <span style="color:rgb(9,136,90)">#0</span> {</div><div>  <span style="color:rgb(205,49,49)">%3</span> <span style="color:rgb(205,49,49)">=</span> <span style="color:rgb(0,0,255)">icmp</span> <span style="color:rgb(0,128,128)">eq</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">1</span>, <span style="color:rgb(9,136,90)">0</span>, !<span style="color:rgb(0,128,128)">nosanitize</span> !<span style="color:rgb(9,136,90)">2</span></div><div>  <span style="color:rgb(0,0,255)">br</span> <span style="color:rgb(0,128,128)">i1</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">3</span>, <span style="color:rgb(0,128,128)">label</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">4</span>, <span style="color:rgb(0,128,128)">label</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">7</span>, !<span style="color:rgb(0,128,128)">prof</span> !<span style="color:rgb(9,136,90)">3</span>, !<span style="color:rgb(0,128,128)">nosanitize</span> !<span style="color:rgb(9,136,90)">2</span></div><br><div>  <span style="color:rgb(205,49,49)">%5</span> <span style="color:rgb(205,49,49)">=</span> <span style="color:rgb(0,0,255)">zext</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">0</span> <span style="color:rgb(0,128,128)">to</span> <span style="color:rgb(0,128,128)">i64</span>, !<span style="color:rgb(0,128,128)">nosanitize</span> !<span style="color:rgb(9,136,90)">2</span></div><div>  <span style="color:rgb(205,49,49)">%6</span> <span style="color:rgb(205,49,49)">=</span> <span style="color:rgb(0,0,255)">zext</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">1</span> <span style="color:rgb(0,128,128)">to</span> <span style="color:rgb(0,128,128)">i64</span>, !<span style="color:rgb(0,128,128)">nosanitize</span> !<span style="color:rgb(9,136,90)">2</span></div><div>  <span style="color:rgb(0,0,255)">tail</span> <span style="color:rgb(0,128,128)">call</span> <span style="color:rgb(0,128,128)">void</span> <span style="color:rgb(0,128,128)">@__ubsan_handle_divrem_overflow</span>(<span style="color:rgb(0,128,128)">i8</span>* <span style="color:rgb(0,128,128)">bitcast</span> ({ { [<span style="color:rgb(9,136,90)">63</span> <span style="color:rgb(0,128,128)">x</span> <span style="color:rgb(0,128,128)">i8</span>]*, <span style="color:rgb(0,128,128)">i32</span>, <span style="color:rgb(0,128,128)">i32</span> }, { <span style="color:rgb(0,128,128)">i16</span>, <span style="color:rgb(0,128,128)">i16</span>, [<span style="color:rgb(9,136,90)">15</span> <span style="color:rgb(0,128,128)">x</span> <span style="color:rgb(0,128,128)">i8</span>] }* }* <span style="color:rgb(0,128,128)">@1</span> <span style="color:rgb(0,128,128)">to</span> <span style="color:rgb(0,128,128)">i8</span>*), <span style="color:rgb(0,128,128)">i64</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">5</span>, <span style="color:rgb(0,128,128)">i64</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">6</span>) <span style="color:rgb(9,136,90)">#2</span>, !<span style="color:rgb(0,128,128)">nosanitize</span> !<span style="color:rgb(9,136,90)">2</span></div><div>  <span style="color:rgb(0,0,255)">br</span> <span style="color:rgb(0,128,128)">label</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">7</span>, !<span style="color:rgb(0,128,128)">nosanitize</span> !<span style="color:rgb(9,136,90)">2</span></div><br><div>  <span style="color:rgb(205,49,49)">%8</span> <span style="color:rgb(205,49,49)">=</span> <span style="color:rgb(0,0,255)">udiv</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">0</span>, <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">1</span></div><div>  <span style="color:rgb(0,0,255)">ret</span> <span style="color:rgb(0,128,128)">i32</span> <span style="color:rgb(205,49,49)">%</span><span style="color:rgb(9,136,90)">8</span></div><div>}</div><div><br></div></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, Aug 2, 2018 at 6:22 PM Hongbin Zheng <<a href="mailto:etherzhhb@gmail.com">etherzhhb@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div dir="auto">Maybe because when n is 0, it trap? And you simplification get rid of the trap?</div></div><div><br><div class="gmail_quote"><div dir="ltr">On Thu, Aug 2, 2018 at 10:03 AM Alexandre Isoard via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hello,<div><br></div><div>I noticed that our SCEVUDiv does not simplify anything when the RHS is not a constant.</div><div>Is that because there is a potential issue with division by zero being simplified?</div><div><br></div><div>For instance, would it be okay to simplify:</div><div><br></div><div>((%i * %n)<nuw> /u %n)</div><div><br></div><div>into: %i</div><div><br></div><div>The way I see it, if %n is 0, then that division is undefined and we can "define it", at will, as being %i.</div><div><br></div><div>Would that make sense in SCEV world?</div></div><div dir="ltr"><div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="m_2705340975160660940m_-5036747400986434173gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><b>Alexandre Isoard</b><br></div></div></div></div>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><b>Alexandre Isoard</b><br></div></div>