[LLVMdev] LazyValueInfo.getPredicateAt

Hal Finkel hfinkel at anl.gov
Thu Apr 16 11:29:18 PDT 2015


----- Original Message -----
> From: "Artur Pilipenko" <apilipenko at azulsystems.com>
> To: "Hal Finkel" <hfinkel at anl.gov>
> Cc: llvmdev at cs.uiuc.edu
> Sent: Thursday, April 16, 2015 1:19:49 PM
> Subject: Re: [LLVMdev] LazyValueInfo.getPredicateAt
> 
> Hi,
> 
> > Apr 16, 2015, в 9:27 PM, "Hal Finkel" <hfinkel at anl.gov> написал(а):
> > 
> > ----- Original Message -----
> >> From: "Artur Pilipenko" <apilipenko at azulsystems.com>
> >> To: llvmdev at cs.uiuc.edu
> >> Sent: Thursday, April 16, 2015 7:22:03 AM
> >> Subject: [LLVMdev] LazyValueInfo.getPredicateAt
> >> 
> >> Hi,
> >> 
> >> Is it intentional that LazyValueInfo.getPredicateAt doesn't solve
> >> for
> >> the value and only takes assumptions into account?
> > 
> > Yes. That function is used from only one place in JumpThreading:
> > 
> >    } else if (CondBr && CondConst && CondBr->isConditional()) {
> >      // There might be an invariant in the same block with the
> >      conditional
> >      // that can determine the predicate.
> > 
> >      LazyValueInfo::Tristate Ret =
> >        LVI->getPredicateAt(CondCmp->getPredicate(),
> >        CondCmp->getOperand(0),
> >                            CondConst, CondCmp);
> >      if (Ret != LazyValueInfo::Unknown) {
> > ...
> > 
> > and handles a situation that can only happen with @llvm.assume
> > (where new information regarding a value's range is introduced in
> > the block containing the conditional; normally this can only
> > happen on edges and is picked up by getValueOnEdge, etc.)
> > 
> > Why do you ask?
> I'm working on exploiting dereferenceable_or_null attribute in LICM
> pass. For values marked with this attribute I need to know if they
> are known-non-null at some point (e.g. there is a null check
> dominating this point). One way to do this is to use LVI.

Ah, okay. If we have a use case, I'm fine with extending it to trigger a lattice calculation there too.

 -Hal

> 
> Artur
> > 
> > -Hal
> > 
> >> 
> >> getPredicateAt gets lattice value from cache using getValueAt
> >> call:
> >> LVILatticeVal LazyValueInfoCache::getValueAt(Value *V, Instruction
> >> *CxtI) {
> >>   ...
> >>   LVILatticeVal Result;
> >>   mergeAssumeBlockValueConstantRange(V, Result, CxtI);
> >>   ...
> >>   return Result;
> >> }
> >> 
> >> Other get functions in LazyValueInfoCache solve to obtain the
> >> result:
> >> LVILatticeVal LazyValueInfoCache::getValueInBlock(Value *V,
> >> BasicBlock *BB,
> >>                                                   Instruction
> >>                                                   *CxtI)
> >>                                                   {
> >> 
> >>   ...
> >>   pushBlockValue(std::make_pair(BB, V));
> >>   solve();
> >>   LVILatticeVal Result = getBlockValue(V, BB);
> >>   mergeAssumeBlockValueConstantRange(V, Result, CxtI);
> >>   ...
> >>   return Result;
> >> }
> >> 
> >> Thanks,
> >> Artur
> >> _______________________________________________
> >> LLVM Developers mailing list
> >> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> >> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> >> 
> > 
> > --
> > Hal Finkel
> > Assistant Computational Scientist
> > Leadership Computing Facility
> > Argonne National Laboratory
> 

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




More information about the llvm-dev mailing list