<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jun 14, 2016 at 1:58 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:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex"><span class="">On Tue, Jun 14, 2016 at 1:48 PM, David Majnemer<br>
<<a href="mailto:david.majnemer@gmail.com">david.majnemer@gmail.com</a>> wrote:<br>
> Hmm, what if we have:<br>
><br>
> volatile store i32 0, i32* %p<br>
> call void @llvm.assume(i1 false)<br>
> ...<br>
><br>
> Can't this sort of logic let us sink the store past the assume? What if the<br>
> assume gets replaced with unreachable?<br>
<br>
</span>I think that's fine.  assume(X) does not mean "the control flow can<br>
move past the assume only if X is true", it means "due to some<br>
external invariant I know that X is true".  So in the above example,<br>
we know that the volatile store itself is UB since it postdominates<br>
assume(false).<br></blockquote><div><br></div><div><br></div><div>Hmm.  What about tail merging:</div><div><br></div><div>head:</div><div>  br i1 %cond, label %t, %f<br></div><div><br></div><div>t:</div><div>  store volatile i32 0, i32* %p</div><div>  unreachable</div><div><br></div><div>f:</div>  store volatile i32 0, i32* %p</div><div class="gmail_quote">  call void @llvm.assume(i1 false)</div><div class="gmail_quote"><br></div><div class="gmail_quote">into:</div><div class="gmail_quote"><br></div><div class="gmail_quote">head:</div><div class="gmail_quote">  store volatile i32 0, i32* %p</div><div class="gmail_quote">  call void @llvm.assume(i1 false)</div><div class="gmail_quote"><br></div><div class="gmail_quote">?</div><div class="gmail_quote"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<span class=""><font color="#888888"><br>
-- Sanjoy<br>
</font></span><div class=""><div class="h5"><br>
><br>
><br>
> On Tue, Jun 14, 2016 at 1:33 PM, Sanjoy Das via llvm-commits<br>
> <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br>
>><br>
>> Forgot to mention in the commit message: this regression was<br>
>> introduced in <a href="http://reviews.llvm.org/rL272489" rel="noreferrer" target="_blank">http://reviews.llvm.org/rL272489</a><br>
>><br>
>> On Tue, Jun 14, 2016 at 1:23 PM, Sanjoy Das via llvm-commits<br>
>> <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br>
>> > Author: sanjoy<br>
>> > Date: Tue Jun 14 15:23:16 2016<br>
>> > New Revision: 272703<br>
>> ><br>
>> > URL: <a href="http://llvm.org/viewvc/llvm-project?rev=272703&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=272703&view=rev</a><br>
>> > Log:<br>
>> > [ValueTracking] Calls to @llvm.assume always return<br>
>> ><br>
>> > This change teaches llvm::isGuaranteedToTransferExecutionToSuccessor<br>
>> > that calls to @llvm.assume always terminate.  Most other relevant<br>
>> > intrinsics should be covered by the "CS.onlyReadsMemory() ||<br>
>> > CS.onlyAccessesArgMemory()" bit but we were missing @llvm.assumes<br>
>> > because we state that it clobbers memory.<br>
>> ><br>
>> > Added an LICM test case, but this change is not specific to LICM.<br>
>> ><br>
>> > Modified:<br>
>> >     llvm/trunk/lib/Analysis/ValueTracking.cpp<br>
>> >     llvm/trunk/test/Transforms/LICM/assume.ll<br>
>> ><br>
>> > Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp<br>
>> > URL:<br>
>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=272703&r1=272702&r2=272703&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=272703&r1=272702&r2=272703&view=diff</a><br>
>> ><br>
>> > ==============================================================================<br>
>> > --- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)<br>
>> > +++ llvm/trunk/lib/Analysis/ValueTracking.cpp Tue Jun 14 15:23:16 2016<br>
>> > @@ -3478,7 +3478,8 @@ bool llvm::isGuaranteedToTransferExecuti<br>
>> >      // but it's consistent with other passes. See <a href="http://llvm.org/PR965" rel="noreferrer" target="_blank">http://llvm.org/PR965</a><br>
>> > .<br>
>> >      // FIXME: This isn't aggressive enough; a call which only writes to<br>
>> > a<br>
>> >      // global is guaranteed to return.<br>
>> > -    return CS.onlyReadsMemory() || CS.onlyAccessesArgMemory();<br>
>> > +    return CS.onlyReadsMemory() || CS.onlyAccessesArgMemory() ||<br>
>> > +           match(I, m_Intrinsic<Intrinsic::assume>());<br>
>> >    }<br>
>> ><br>
>> >    // Other instructions return normally.<br>
>> ><br>
>> > Modified: llvm/trunk/test/Transforms/LICM/assume.ll<br>
>> > URL:<br>
>> > <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LICM/assume.ll?rev=272703&r1=272702&r2=272703&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LICM/assume.ll?rev=272703&r1=272702&r2=272703&view=diff</a><br>
>> ><br>
>> > ==============================================================================<br>
>> > --- llvm/trunk/test/Transforms/LICM/assume.ll (original)<br>
>> > +++ llvm/trunk/test/Transforms/LICM/assume.ll Tue Jun 14 15:23:16 2016<br>
>> > @@ -1,6 +1,7 @@<br>
>> >  ; RUN: opt -licm -basicaa < %s -S | FileCheck %s<br>
>> ><br>
>> > -define void @f(i1 %p) nounwind ssp {<br>
>> > +define void @f_0(i1 %p) nounwind ssp {<br>
>> > +; CHECK-LABEL: @f_0(<br>
>> >  entry:<br>
>> >    br label %for.body<br>
>> ><br>
>> > @@ -31,4 +32,20 @@ for.end104:<br>
>> >    ret void<br>
>> >  }<br>
>> ><br>
>> > +define void @f_1(i1 %cond, i32* %ptr) {<br>
>> > +; CHECK-LABEL: @f_1(<br>
>> > +; CHECK: %val = load i32, i32* %ptr<br>
>> > +; CHECK-NEXT:  br label %loop<br>
>> > +<br>
>> > +entry:<br>
>> > +  br label %loop<br>
>> > +<br>
>> > +loop:<br>
>> > +  %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]<br>
>> > +  call void @llvm.assume(i1 %cond)<br>
>> > +  %val = load i32, i32* %ptr<br>
>> > +  %x.inc = add i32 %x, %val<br>
>> > +  br label %loop<br>
>> > +}<br>
>> > +<br>
>> >  declare void @llvm.assume(i1)<br>
>> ><br>
>> ><br>
>> > _______________________________________________<br>
>> > llvm-commits mailing list<br>
>> > <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
>> > <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
>><br>
>><br>
>><br>
>> --<br>
>> Sanjoy Das<br>
>> <a href="http://playingwithpointers.com" rel="noreferrer" target="_blank">http://playingwithpointers.com</a><br>
>> _______________________________________________<br>
>> llvm-commits mailing list<br>
>> <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
>> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
><br>
><br>
<br>
<br>
<br>
--<br>
Sanjoy Das<br>
<a href="http://playingwithpointers.com" rel="noreferrer" target="_blank">http://playingwithpointers.com</a><br>
</div></div></blockquote></div><br></div></div>