[LLVMdev] LazyValueInfo.getPredicateAt

Artur Pilipenko apilipenko at azulsystems.com
Thu Apr 16 11:19:49 PDT 2015


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. 

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




More information about the llvm-dev mailing list