<div dir="ltr">In this particular case, I believe llvm is really emitting a store of undef to a nullptr. I think this later gets turned into a trap. Here's the relevant code from instcombine.<div><br></div><div><div>  // load(gep null, ...) -> unreachable</div><div>  // load null/undef -> unreachable</div><div>  // TODO: Consider a target hook for valid address spaces for this xforms.</div><div>  if (canSimplifyNullLoadOrGEP(LI, Op)) {</div><div>    // Insert a new store to null instruction before the load to indicate</div><div>    // that this code is not reachable.  We do this instead of inserting</div><div>    // an unreachable instruction directly because we cannot modify the</div><div>    // CFG.</div><div>    new StoreInst(UndefValue::get(LI.getType()),</div><div>                  Constant::getNullValue(Op->getType()), &LI);</div><div>    return replaceInstUsesWith(LI, UndefValue::get(LI.getType()));</div><div>  }</div></div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature">~Craig</div></div>
<br><div class="gmail_quote">On Fri, Jul 7, 2017 at 3:44 PM, Chris Lattner via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">On Jul 7, 2017, at 1:40 PM, Peter Lawrence <<a href="mailto:peterl95124@sbcglobal.net">peterl95124@sbcglobal.net</a>> wrote:<br>
> Chris,<br>
</span><span class="">>           The issue the original poster brought up is that instead of a compiler<br>
> that as you say “makes things work” and “gets the job done” we have a compiler<br>
> that intentionally deletes “undefined behavior”, on the assumption that since it<br>
> is the users responsibility to avoid UB this code must be unreachable and<br>
> is therefore safe to delete.<br>
><br>
> It seems like there are three things the compiler could do with undefined behavior<br>
> 1)   let the code go through (perhaps with a warning)<br>
> 2)   replace the code with a trap<br>
> 3)   optimize the code as unreachable (no warning because we’re assuming this is the users intention)<br>
<br>
</span>Hi Peter,<br>
<br>
I think you have a somewhat fundamental misunderstanding of how UB works (or rather, why it is so crappy and doesn’t really work :-).  The compiler can and does do all three of those, and it doesn’t have to have consistent algorithms for how it picks.  I highly recommend you read some blog posts I wrote about it years ago, starting with:<br>
<a href="http://blog.llvm.org/2011/05/what-every-c-programmer-should-know.html" rel="noreferrer" target="_blank">http://blog.llvm.org/2011/05/<wbr>what-every-c-programmer-<wbr>should-know.html</a><br>
<br>
John Regehr also has written a lot on the topic, including the recent post:<br>
<a href="https://blog.regehr.org/archives/1520" rel="noreferrer" target="_blank">https://blog.regehr.org/<wbr>archives/1520</a><br>
<br>
What you should take from this is that while UB is an inseperable part of C programming, that this is a depressing and faintly terrifying thing.  The tooling built around the C family of languages helps make the situation “less bad”, but it is still pretty bad.  The only solution is to move to new programming languages that don’t inherit the problem of C.  I’m a fan of Swift, but there are others.<br>
<br>
In the case of this particular thread, we aren’t trying to fix UB, we’re trying to switch one very specific syntactic idiom from UB to defined.<br>
<br>
-Chris<br>
<br>
______________________________<wbr>_________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org">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/<wbr>mailman/listinfo/llvm-dev</a><br>
</blockquote></div><br></div>