<div dir="ltr">ok thanks.  A more reduced test case can show different behavior between O2 and O0.<div><br></div><div>Say we have</div><div><br></div><div>unsigned maybe_divide (unsigned *ptr) {</div><div>   int flag = false;</div><div>   unsigned val = 500/ptr[0];</div><div>   if (flag)</div><div>       return val;</div><div>   return (unsigned)(intptr_t)ptr);</div><div>}</div><div><br></div><div>int main() {</div><div>   unsigned g = 0;</div><div>    return maybe_divide(&g);</div><div>}</div><div>   </div><div><br></div><div>At O2, it runs fine, but at O0 it core dumps.</div><div><br></div><div>what is the right behavior?</div><div><br></div><div>David</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Feb 27, 2016 at 5:21 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="">On Sat, Feb 27, 2016 at 4:21 PM, Xinliang David Li <<a href="mailto:xinliangli@gmail.com">xinliangli@gmail.com</a>> wrote:<br>
> So in this case, ptr[0] = 10 is propagated into one copy of maybe_devide (in<br>
> source a), and ptr[0]=10 in caller_a is DSEed ?<br>
<br>
</span>`ptr[0] = 10` is not really propagated anywhere.  What happens is that<br>
`source-a` 's copy of `maybe_divide` gets optimized to a `ret<br>
(unsigned) ptr` (after inlining in the body of `always_false`)[1], so<br>
it is able to DSE the store `ptr[0] = 10`.  But `source-b` s copy of<br>
`maybe_divide` still has the load and the division (since it does not<br>
have access to `always_false` 's body), so if `caller_a` ends up<br>
calling that implementation of `maybe_divide`, we get a `SIGFPE`.<br>
<br>
[1]: For reference, after inlining `always_false`, the `maybe_divide`<br>
  becomes<br>
<br>
    unsigned maybe_divide(unsigned *ptr) {<br>
      unsigned val = 500 / ptr[0]; // dead value<br>
      if (false)<br>
        return val;<br>
      return (unsigned)((intptr_t)ptr);<br>
    }<br>
<span class="HOEnZb"><font color="#888888"><br>
-- Sanjoy<br>
</font></span></blockquote></div><br></div>