<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Jul 15, 2016 at 2:30 PM, 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"><span class="">Hi Daniel,<br>
<br>
Daniel Berlin wrote:<br></span><span class="">
>     However, I didn't quite understand your point about may-throw -- how<br>
>     is may-throw different from a generic side-effect (volatile store,<br>
>     syscall etc.)?  All of those can't be hoisted or sunk -- we have to<br>
>     make sure that they execute in semantically the same conditions that<br>
>     they did in the original program.<br>
><br>
> may-throw is, AFAIK, worse. They act as barriers to sinking *other<br>
> things*. You cannot sink a store past a may-throw, or hoist a load above<br>
> them.  You can't optimize stores across them either:<br>
<br></span>
Don't we have the same problems for "exit(0)" </blockquote><div><br></div><div>This is a noreturn call, so yes, iit has another hidden control flow-side-effect of a slightly different kind. GCC models it as an extra fake edge from the BB containing a noreturn call to the exit block of the function, so that nothing sinks below it by accident.</div><div><br></div><div>I do not believe we do anything special here, so yes, it also has the same general issue as may-throw.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">and "while(true) {<br>
*volatile_ptr = 42; }" too?</blockquote><div><br></div><div>I can move non-volatile stores past volatile stores :)</div><div><br></div><div>Or did you mean something else?</div><div><br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">  Both of these are optimization barriers<br>
while still being "nounwind" (i.e. could be legitimately contained in<br>
a nounwind function); though not in exactly the same way as a<br>
may-throw call (e.g. you can DSE across exit(0) and you can sink<br>
non-atomic loads past "while(true) {...}").<br></blockquote><div><br></div><div>I do not claim there are not other instances. Noreturn is in fact, a good exampl). But i would also bet they are just as buggy as may-throw was for the same reason, and they would cause the same N^2ness.</div><div><br>Essentially, anything that has produces hidden control flow (instead of just depending on hidden control flow) will have this issue.</div><div>The also are things that any flag/analysis should be able to flag.<br></div><div><br></div></div></div></div>