mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
[SCEV] accurate range for addrecexpr with nuw flag
If addrecexpr has nuw flag, the value should never be less than its start value and start value does not required to be SCEVConstant. Reviewed By: nikic, sanjoy Differential Revision: https://reviews.llvm.org/D71690
This commit is contained in:
parent
9ea03cb0fe
commit
d8d9e920a8
@ -5672,11 +5672,12 @@ ScalarEvolution::getRangeRef(const SCEV *S,
|
||||
if (const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(S)) {
|
||||
// If there's no unsigned wrap, the value will never be less than its
|
||||
// initial value.
|
||||
if (AddRec->hasNoUnsignedWrap())
|
||||
if (const SCEVConstant *C = dyn_cast<SCEVConstant>(AddRec->getStart()))
|
||||
if (!C->getValue()->isZero())
|
||||
ConservativeResult = ConservativeResult.intersectWith(
|
||||
ConstantRange(C->getAPInt(), APInt(BitWidth, 0)), RangeType);
|
||||
if (AddRec->hasNoUnsignedWrap()) {
|
||||
APInt UnsignedMinValue = getUnsignedRangeMin(AddRec->getStart());
|
||||
if (!UnsignedMinValue.isNullValue())
|
||||
ConservativeResult = ConservativeResult.intersectWith(
|
||||
ConstantRange(UnsignedMinValue, APInt(BitWidth, 0)), RangeType);
|
||||
}
|
||||
|
||||
// If there's no signed wrap, and all the operands except initial value have
|
||||
// the same sign or zero, the value won't ever be:
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
; copied from flags-from-poison.ll
|
||||
; CHECK-LABEL: @test-add-nuw
|
||||
; CHECK: --> {(1 + %offset)<nuw>,+,1}<nuw><%loop> U: full-set S: full-set
|
||||
; CHECK: --> {(1 + %offset)<nuw>,+,1}<nuw><%loop> U: [1,0) S: [1,0)
|
||||
define void @test-add-nuw(float* %input, i32 %offset, i32 %numIterations) {
|
||||
entry:
|
||||
br label %loop
|
||||
@ -20,7 +20,7 @@ exit:
|
||||
}
|
||||
|
||||
; CHECK-LABEL: @test-addrec-nuw
|
||||
; CHECK: --> {(1 + (10 smax %offset))<nuw>,+,1}<nuw><%loop> U: full-set S: full-set
|
||||
; CHECK: --> {(1 + (10 smax %offset))<nuw>,+,1}<nuw><%loop> U: [11,0) S: [11,0)
|
||||
define void @test-addrec-nuw(float* %input, i32 %offset, i32 %numIterations) {
|
||||
entry:
|
||||
%cmp = icmp sgt i32 %offset, 10
|
||||
|
Loading…
x
Reference in New Issue
Block a user