[llvm] r272703 - [ValueTracking] Calls to @llvm.assume always return

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 14 17:12:42 PDT 2016


On Tue, Jun 14, 2016 at 1:58 PM, Sanjoy Das <sanjoy at playingwithpointers.com>
wrote:

> On Tue, Jun 14, 2016 at 1:48 PM, David Majnemer
> <david.majnemer at gmail.com> wrote:
> > Hmm, what if we have:
> >
> > volatile store i32 0, i32* %p
> > call void @llvm.assume(i1 false)
> > ...
> >
> > Can't this sort of logic let us sink the store past the assume? What if
> the
> > assume gets replaced with unreachable?
>
> I think that's fine.  assume(X) does not mean "the control flow can
> move past the assume only if X is true", it means "due to some
> external invariant I know that X is true".  So in the above example,
> we know that the volatile store itself is UB since it postdominates
> assume(false).
>


Hmm.  What about tail merging:

head:
  br i1 %cond, label %t, %f

t:
  store volatile i32 0, i32* %p
  unreachable

f:
  store volatile i32 0, i32* %p
  call void @llvm.assume(i1 false)

into:

head:
  store volatile i32 0, i32* %p
  call void @llvm.assume(i1 false)

?


>
> -- Sanjoy
>
> >
> >
> > On Tue, Jun 14, 2016 at 1:33 PM, Sanjoy Das via llvm-commits
> > <llvm-commits at lists.llvm.org> wrote:
> >>
> >> Forgot to mention in the commit message: this regression was
> >> introduced in http://reviews.llvm.org/rL272489
> >>
> >> On Tue, Jun 14, 2016 at 1:23 PM, Sanjoy Das via llvm-commits
> >> <llvm-commits at lists.llvm.org> wrote:
> >> > Author: sanjoy
> >> > Date: Tue Jun 14 15:23:16 2016
> >> > New Revision: 272703
> >> >
> >> > URL: http://llvm.org/viewvc/llvm-project?rev=272703&view=rev
> >> > Log:
> >> > [ValueTracking] Calls to @llvm.assume always return
> >> >
> >> > This change teaches llvm::isGuaranteedToTransferExecutionToSuccessor
> >> > that calls to @llvm.assume always terminate.  Most other relevant
> >> > intrinsics should be covered by the "CS.onlyReadsMemory() ||
> >> > CS.onlyAccessesArgMemory()" bit but we were missing @llvm.assumes
> >> > because we state that it clobbers memory.
> >> >
> >> > Added an LICM test case, but this change is not specific to LICM.
> >> >
> >> > Modified:
> >> >     llvm/trunk/lib/Analysis/ValueTracking.cpp
> >> >     llvm/trunk/test/Transforms/LICM/assume.ll
> >> >
> >> > Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
> >> > URL:
> >> >
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=272703&r1=272702&r2=272703&view=diff
> >> >
> >> >
> ==============================================================================
> >> > --- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
> >> > +++ llvm/trunk/lib/Analysis/ValueTracking.cpp Tue Jun 14 15:23:16 2016
> >> > @@ -3478,7 +3478,8 @@ bool llvm::isGuaranteedToTransferExecuti
> >> >      // but it's consistent with other passes. See
> http://llvm.org/PR965
> >> > .
> >> >      // FIXME: This isn't aggressive enough; a call which only writes
> to
> >> > a
> >> >      // global is guaranteed to return.
> >> > -    return CS.onlyReadsMemory() || CS.onlyAccessesArgMemory();
> >> > +    return CS.onlyReadsMemory() || CS.onlyAccessesArgMemory() ||
> >> > +           match(I, m_Intrinsic<Intrinsic::assume>());
> >> >    }
> >> >
> >> >    // Other instructions return normally.
> >> >
> >> > Modified: llvm/trunk/test/Transforms/LICM/assume.ll
> >> > URL:
> >> >
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LICM/assume.ll?rev=272703&r1=272702&r2=272703&view=diff
> >> >
> >> >
> ==============================================================================
> >> > --- llvm/trunk/test/Transforms/LICM/assume.ll (original)
> >> > +++ llvm/trunk/test/Transforms/LICM/assume.ll Tue Jun 14 15:23:16 2016
> >> > @@ -1,6 +1,7 @@
> >> >  ; RUN: opt -licm -basicaa < %s -S | FileCheck %s
> >> >
> >> > -define void @f(i1 %p) nounwind ssp {
> >> > +define void @f_0(i1 %p) nounwind ssp {
> >> > +; CHECK-LABEL: @f_0(
> >> >  entry:
> >> >    br label %for.body
> >> >
> >> > @@ -31,4 +32,20 @@ for.end104:
> >> >    ret void
> >> >  }
> >> >
> >> > +define void @f_1(i1 %cond, i32* %ptr) {
> >> > +; CHECK-LABEL: @f_1(
> >> > +; CHECK: %val = load i32, i32* %ptr
> >> > +; CHECK-NEXT:  br label %loop
> >> > +
> >> > +entry:
> >> > +  br label %loop
> >> > +
> >> > +loop:
> >> > +  %x = phi i32 [ 0, %entry ], [ %x.inc, %loop ]
> >> > +  call void @llvm.assume(i1 %cond)
> >> > +  %val = load i32, i32* %ptr
> >> > +  %x.inc = add i32 %x, %val
> >> > +  br label %loop
> >> > +}
> >> > +
> >> >  declare void @llvm.assume(i1)
> >> >
> >> >
> >> > _______________________________________________
> >> > llvm-commits mailing list
> >> > llvm-commits at lists.llvm.org
> >> > http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> >>
> >>
> >>
> >> --
> >> Sanjoy Das
> >> http://playingwithpointers.com
> >> _______________________________________________
> >> llvm-commits mailing list
> >> llvm-commits at lists.llvm.org
> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> >
> >
>
>
>
> --
> Sanjoy Das
> http://playingwithpointers.com
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160614/20298ec8/attachment.html>


More information about the llvm-commits mailing list