<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Feb 29, 2016 at 11:08 AM, Sanjoy Das <span dir="ltr"><<a href="mailto:sanjoy@playingwithpointers.com" target="_blank">sanjoy@playingwithpointers.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I may be misunderstanding you here, but I've tried to reply inline<br>
below:<br>
<span class=""><br>
On Mon, Feb 29, 2016 at 11:00 AM, Xinliang David Li<br>
<<a href="mailto:xinliangli@gmail.com">xinliangli@gmail.com</a>> wrote:<br>
> yes -- it is UB if user writes code like this.<br>
<br>
</span>So we agree that given that the user wrote exactly what you have<br>
above, there is no guarantee from the compiler to generate anything<br>
meaningful?<br>
<span class=""><br></span></blockquote><div><br></div><div>yes.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">
> What if the g=0 is<br>
> speculatively moved above the call of maybe_divide at O2?  My point is that<br>
<br>
</span>You mean, the program was initially something like<br>
<br>
g = 42<br>
maybe_divide(&g)<br>
g = 0<br>
<br>
which LLVM optimized to<br>
<br>
g = 0<br>
maybe_divide(&g)<br>
<br>
?<br>
<br>
That code motion is legal only if `maybe_divide` is `readnone` -- if<br>
LLVM speculates the store without first inferring `readnone` on<br>
`maybe_divide`, that's buggy for a different reason.<br></blockquote><div><br></div><div>right.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<span class=""><br>
> such runtime behavior difference may not specific to multi-TU definition<br>
> scenario.<br>
<br>
</span>The multi-TU constraint is relevant here because the linker may<br>
legally replace a `readnone` version of `maybe_divide` with version<br>
that reads memory; retroactively invalidating the optimization above.  If<br>
there is only one TU, then the `maybe_divide` the optimizer sees is<br>
what the final executable gets; and all is well.<br></blockquote><div><br></div><div>yep.</div><div><br></div><div>thanks,</div><div><br></div><div>David</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<span class="HOEnZb"><font color="#888888"><br>
-- Sanjoy<br>
</font></span></blockquote></div><br></div></div>