<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Mar 31, 2017 at 4:48 AM, Michael Kruse <span dir="ltr"><<a href="mailto:llvmdev@meinersbur.de" target="_blank">llvmdev@meinersbur.de</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><span class="gmail-">2017-03-31 3:38 GMT+02:00 Daniel Berlin <<a href="mailto:dberlin@dberlin.org">dberlin@dberlin.org</a>>:<br>
> Sure, and you definitely can't transform an unconditional store to a<br>
> conditional one unless the uses are guarded by the same condition, or you<br>
> can prove it already had that value (in which case, the memset would also be<br>
> dead) :)<br>
><br>
> ie<br>
> memset(a, 0)<br>
> use a<br>
><br>
> can't be transformed to<br>
> if (c)<br>
>   memset(a, 0)<br>
> use a<br>
><br>
> So again, if polly is making a lifetime.start conditional when the use is<br>
> not conditional, that's a bug in polly, regardless of the bug in stack<br>
> coloring's ability to handle it.<br>
<br>
</span>InstCombine transforms memset(a,1) to a single StoreInst, but keeps<br>
the memset if the size argument is zero. A StoreInst can be optimized<br>
away, e.g. by DeadStoreElimination. I wonder, are the semantics of<br>
memset(a, 0) different than "do nothing"?<br></blockquote><div><br></div><div>Yes, they are, because the value of a could be "not zero" :)</div><div><br></div><div>to whit:<br><br></div><div>if (load a == 50)<br>  memset (a, 0)</div><div>if (load a == 0)<br></div><div>   do something</div><div><br></div><div><br></div><div>If *a starts out as 50, this memset makes it do something.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Where is the chain of transformations<br>
<br>
memset(&a, '0', sizeof a);<br>
if (c)<br>
  a = 1;<br>
<br>
=><br>
<br>
if (c) {<br>
  memset(&a, '0', sizeof a);<br>
  a = 1;<br>
} else<br>
  memset(&a, '0', sizeof a);<br>
<br></blockquote><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">=><br>
<br>
if (c) {<br>
  memset(&a, '0', sizeof a);<br>
  a = 1;<br>
} else<br>
  memset(&a, '0', sizeof a);<br>
<br>
=><br>
<br>
if (c) {<br>
  a = 0;<br>
  a = 1;<br>
} else<br>
  memset(&a, '0', sizeof a);<br>
<br>
=><br>
<br>
if (c)<br>
  a = 1;<br>
else<br>
  memset(&a, '0', sizeof a);<br>
<br>
=><br>
if (c)<br>
  a = 0;<br>
if (!c)<br>
  memset(&a, '0', sizeof a);<br>
<br>
<br>
not legal?<br></blockquote><div><br></div><div>This is completely legal assuming no further use of a in the if(a) block</div><div><br></div><div>But lifetime.start is *not* a memset, and as mentioned, it was specifically built to be not moved.</div><div>As also mentioned, i think these are crappy semantics, but that's the ones we built ATM :)</div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<span class="gmail-HOEnZb"><font color="#888888"><br>
Michael<br>
</font></span></blockquote></div><br></div></div>