[llvm] r219688 - [LVI] Check for @llvm.assume dominating the edge branch

Hal Finkel hfinkel at anl.gov
Wed Oct 15 17:50:47 PDT 2014


----- Original Message -----
> From: "Philip Reames" <listmail at philipreames.com>
> To: "Hal Finkel" <hfinkel at anl.gov>, llvm-commits at cs.uiuc.edu
> Sent: Tuesday, October 14, 2014 1:28:41 PM
> Subject: Re: [llvm] r219688 - [LVI] Check for @llvm.assume dominating the edge branch
> 
> Hal,
> 
> We had a non-trivial conversation about why using the CxtI
> information
> was valid at all.  Would you mind adding a comment to that effect?
> Otherwise, I'm going to think there's a bug here every time I glance
> at
> this code.  :)

Agreed. r219882.

Thanks again,
Hal

> 
> Philip
> 
> On 10/14/2014 09:04 AM, Hal Finkel wrote:
> > Author: hfinkel
> > Date: Tue Oct 14 11:04:49 2014
> > New Revision: 219688
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=219688&view=rev
> > Log:
> > [LVI] Check for @llvm.assume dominating the edge branch
> >
> > When LazyValueInfo uses @llvm.assume intrinsics to provide
> > edge-value
> > constraints, we should check for intrinsics that dominate the
> > edge's branch,
> > not just any potential context instructions. An assumption that
> > dominates the
> > edge's branch represents a truth on that edge. This is specifically
> > useful, for
> > example, if multiple predecessors assume a pointer to be nonnull,
> > allowing us
> > to simplify a later null comparison.
> >
> > The test case, and an initial patch, were provided by Philip
> > Reames. Thanks!
> >
> > Added:
> >      llvm/trunk/test/Transforms/JumpThreading/assume-edge-dom.ll
> > Modified:
> >      llvm/trunk/lib/Analysis/LazyValueInfo.cpp
> >
> > Modified: llvm/trunk/lib/Analysis/LazyValueInfo.cpp
> > URL:
> > http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LazyValueInfo.cpp?rev=219688&r1=219687&r2=219688&view=diff
> > ==============================================================================
> > --- llvm/trunk/lib/Analysis/LazyValueInfo.cpp (original)
> > +++ llvm/trunk/lib/Analysis/LazyValueInfo.cpp Tue Oct 14 11:04:49
> > 2014
> > @@ -954,6 +954,7 @@ bool LazyValueInfoCache::getEdgeValue(Va
> >   
> >       // Try to intersect ranges of the BB and the constraint on
> >       the edge.
> >       LVILatticeVal InBlock = getBlockValue(Val, BBFrom);
> > +    mergeAssumeBlockValueConstantRange(Val, InBlock,
> > BBFrom->getTerminator());
> >       mergeAssumeBlockValueConstantRange(Val, InBlock, CxtI);
> >       if (!InBlock.isConstantRange())
> >         return true;
> > @@ -971,6 +972,7 @@ bool LazyValueInfoCache::getEdgeValue(Va
> >   
> >     // if we couldn't compute the value on the edge, use the value
> >     from the BB
> >     Result = getBlockValue(Val, BBFrom);
> > +  mergeAssumeBlockValueConstantRange(Val, Result,
> > BBFrom->getTerminator());
> >     mergeAssumeBlockValueConstantRange(Val, Result, CxtI);
> >     return true;
> >   }
> >
> > Added: llvm/trunk/test/Transforms/JumpThreading/assume-edge-dom.ll
> > URL:
> > http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/JumpThreading/assume-edge-dom.ll?rev=219688&view=auto
> > ==============================================================================
> > --- llvm/trunk/test/Transforms/JumpThreading/assume-edge-dom.ll
> > (added)
> > +++ llvm/trunk/test/Transforms/JumpThreading/assume-edge-dom.ll Tue
> > Oct 14 11:04:49 2014
> > @@ -0,0 +1,39 @@
> > +; RUN: opt -S -jump-threading < %s | FileCheck %s
> > +
> > +declare i8* @escape()
> > +declare void @llvm.assume(i1)
> > +
> > +define i1 @test1(i1 %cond) {
> > +entry:
> > +    br i1 %cond, label %taken, label %not_taken
> > +
> > +; CHECK-LABEL: @test1
> > +; CHECK: br i1 %cond, label %no, label %yes
> > +; CHECK: ret i1 true
> > +
> > +taken:
> > +    %res1 = call i8* @escape()
> > +    %a = icmp eq i8* %res1, null
> > +    tail call void @llvm.assume(i1 %a)
> > +    br label %done
> > +not_taken:
> > +    %res2 = call i8* @escape()
> > +    %b = icmp ne i8* %res2, null
> > +    tail call void @llvm.assume(i1 %b)
> > +    br label %done
> > +
> > +; An assume that can be used to simplify this comparison dominates
> > each
> > +; predecessor branch (although no assume dominates the cmp
> > itself). Make sure
> > +; this still can be simplified.
> > +
> > +done:
> > +    %res = phi i8* [ %res1, %taken ], [ %res2, %not_taken ]
> > +    %cnd = icmp ne i8* %res, null
> > +    br i1 %cnd, label %yes, label %no
> > +
> > +yes:
> > +    ret i1 true
> > +no:
> > +    ret i1 false
> > +}
> > +
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 
> 

-- 
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory



More information about the llvm-commits mailing list