forked from OSchip/llvm-project
[LVI] Take range metadata into account while calculating icmp condition constraints
Take range metadata into account for conditions like this: %length = load i32, i32* %length_ptr, !range !{i32 0, i32 2147483647} %cmp = icmp ult i32 %a, %length This is a common pattern for range checks where the length of the array is dynamically loaded. Reviewed By: sanjoy Differential Revision: https://reviews.llvm.org/D23267 llvm-svn: 278496
This commit is contained in:
parent
05e760ec4b
commit
6669f253d5
|
@ -1211,6 +1211,9 @@ static LVILatticeVal getValueFromICmpCondition(Value *Val, ICmpInst *ICI,
|
|||
/*isFullSet=*/true);
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(RHS))
|
||||
RHSRange = ConstantRange(CI->getValue());
|
||||
else if (Instruction *I = dyn_cast<Instruction>(RHS))
|
||||
if (auto *Ranges = I->getMetadata(LLVMContext::MD_range))
|
||||
RHSRange = getConstantRangeFromMetadata(*Ranges);
|
||||
|
||||
// If we're interested in the false dest, invert the condition
|
||||
CmpInst::Predicate Pred =
|
||||
|
|
|
@ -193,3 +193,22 @@ bb:
|
|||
exit:
|
||||
ret void
|
||||
}
|
||||
|
||||
@limit = external global i32
|
||||
; CHECK-LABEL: @test11(
|
||||
define i32 @test11(i32* %p, i32 %i) {
|
||||
%limit = load i32, i32* %p, !range !{i32 0, i32 2147483647}
|
||||
%within.1 = icmp ugt i32 %limit, %i
|
||||
%i.plus.7 = add i32 %i, 7
|
||||
%within.2 = icmp ugt i32 %limit, %i.plus.7
|
||||
%within = and i1 %within.1, %within.2
|
||||
br i1 %within, label %then, label %else
|
||||
|
||||
then:
|
||||
; CHECK: %i.plus.6 = add nuw nsw i32 %i, 6
|
||||
%i.plus.6 = add i32 %i, 6
|
||||
ret i32 %i.plus.6
|
||||
|
||||
else:
|
||||
ret i32 0
|
||||
}
|
||||
|
|
|
@ -445,3 +445,20 @@ then:
|
|||
else:
|
||||
ret i1 false
|
||||
}
|
||||
|
||||
@limit = external global i32
|
||||
define i1 @test15(i32 %a) {
|
||||
; CHECK-LABEL: @test15(
|
||||
; CHECK: then:
|
||||
; CHECK-NEXT: ret i1 false
|
||||
%limit = load i32, i32* @limit, !range !{i32 0, i32 256}
|
||||
%cmp = icmp ult i32 %a, %limit
|
||||
br i1 %cmp, label %then, label %else
|
||||
|
||||
then:
|
||||
%result = icmp eq i32 %a, 255
|
||||
ret i1 %result
|
||||
|
||||
else:
|
||||
ret i1 false
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue