<div dir="ltr"><div class="gmail_quote"><div dir="ltr">On Wed, Feb 24, 2016 at 10:25 PM Sanjoy Das <<a href="mailto:sanjoy@playingwithpointers.com">sanjoy@playingwithpointers.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
Hal Finkel wrote:<br>
<br>
 > But it is not all optimizations that are the problem. Rather, it<br>
 > seems like a select few (e.g. things involving collapsing allowed<br>
 > non-determinism in atomics), and losing those optimizations seems<br>
 > better than generally losing function-attribute deduction.<br>
<br>
If we go by the langref, then optimizations that fold undef are also<br>
problematic (though most C/C++ programs resulting in such IR would<br>
have UB in practice).<br></blockquote><div><br></div><div>I'm also concerned about undef. It isn't clear that we can reasonably ensure that all things involving undef suitably stem from UB in the face of speculation to preclude all "impossible" results coming from interposition.</div><div><br></div><div>I think trying to enumerate the function-local optimizations which are unsafe is *much* more challenging than identifying the interprocedural optimizations which are unsafe, which is essentially what disabling function attribute deduction is doing.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
I think there are non-(non-deterministic) problematic cases too.  The<br>
following won't happen today since `readnone` does not imply<br>
`safe_to_speculate`, but if we add a `safe_to_speculate` property some<br>
day:<br>
<br>
   int foo(bool C) available_externally {<br>
     if (C)<br>
       ((int *) null)++; // UB<br>
     ret 42;<br>
   }<br>
<br>
   void bar() {<br>
     if (<some cond>)<br>
      foo(true);<br>
   }<br>
<br>
Now, normally you can just delete the `if (C)` branch in foo, and it<br>
would become just a `ret 42`, and would look like it is speculatable<br>
above the `<some cond>` check.  But if you then link with an -O0<br>
version, you'll have introduced UB if `<some cond>` is always false at<br>
runtime.<br>
<br>
Today this won't happen since we don't speculate `readnone nounwind`<br>
functions, but could become a problem in the future.<br></blockquote><div><br></div><div>All of this makes me think we're just seeing the tip of the iceberg of ways in which local optimizations can combine with attributes to break this. =/ I really think the problem is as Richard describes the interprocedural movement of information across a comdat-like boundary where replacements may occur with differently transformed code.</div></div></div>