[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