<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Sep 2, 2014 at 4:16 PM, David Majnemer <span dir="ltr"><<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr">So, the trunc makes this transform a bit questionable because you have to reason about bits in the middle of your value.<div>
<br></div><div>Consider the following input values:</div><div>%indvars.iv = 0x........7fffffff<br>
</div><div>%0 = 0x8......1<br></div><div><br></div><div>Consider the following values in the 'before' case:</div><div>%2 = 0x........7fffffff<br></div><div>%indvars.iv.next = 0x........80000000<br></div><div>%tmp = 0x7fffffff</div>

<div>%cmp = false</div><div><br></div><div>This results in the following values in the 'after' case:</div><div>%indvars.iv.next = 0x........80000000<br></div><div>%tmp = 0x80000000<br></div><div>%cmp = true</div>
<div>
<br></div><div>Regardless of whether or not you propagate nsw/nuw, the transform is currently unsound.</div><div><br></div><div>The transform is sound if %indvars.iv has a sufficiently large number of signbits.</div><div>

e.x.</div><div><div>%indvars.iv = sext i31 %invdars.actual to i64</div></div><div><br></div><div>If this precondition holds, any existing nsw or nuw flags should still hold.</div></div></blockquote><div><br></div><div>Some other interesting things spring to mind.</div>
<div>If either (%indvars.iv & (1 << 31)) == 1 or if (%indvars.iv & (1 << 31)) == (%indvars.iv & (1 << 30)), then the transform is safe; I'm not immediately sure about nuw or nsw.</div><div>
 <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div> </div></div><div class="">
<div class="h5"><div class="gmail_extra">
<br><br><div class="gmail_quote">On Tue, Sep 2, 2014 at 3:22 PM, Chad Rosier <span dir="ltr"><<a href="mailto:mcrosier@codeaurora.org" target="_blank">mcrosier@codeaurora.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

David/All,<br>
Just a quick question about NSW/NUW bits, if you've got a second.  I<br>
noticed you've been doing a little work on this as of late.<br>
<br>
I have a bit of code that looks like the following:<br>
<br>
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1<br>
  %2 = add i64 %indvars.iv.next, -1<br>
  %tmp = trunc i64 %2 to i32<br>
  %cmp = icmp slt i32 %tmp, %0<br>
  br i1 %cmp, label %for.body, label %for.end.loopexit<br>
<br>
I'm trying to fold the 2nd add instruction into the compare by changing<br>
the condition from from 'slt' to 'sle':<br>
<br>
  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1<br>
  %tmp = trunc i64 %indvars.iv.next to i32<br>
  %cmp = icmp sle i32 %tmp, %0<br>
  br i1 %cmp, label %for.body, label %for.end.loopexit<br>
<br>
However, AFAICT the NSW bits must be set.  In what cases can we propagate<br>
the NSW bit from the first add to the second, if any?  If a case exists,<br>
can this be handled by the WillNotOverflowSignedAdd function?<br>
<span><font color="#888888"><br>
 Chad<br>
<br>
</font></span></blockquote></div><br></div>
</div></div></blockquote></div><br></div></div>