Index: llvm/lib/Analysis/ScalarEvolution.cpp =================================================================== --- llvm/lib/Analysis/ScalarEvolution.cpp +++ llvm/lib/Analysis/ScalarEvolution.cpp @@ -5678,12 +5678,12 @@ } if (AllNonNeg) ConservativeResult = ConservativeResult.intersectWith( - ConstantRange(APInt(BitWidth, 0), + ConstantRange(getSignedRangeMin(AddRec->getStart()), APInt::getSignedMinValue(BitWidth)), RangeType); else if (AllNonPos) ConservativeResult = ConservativeResult.intersectWith( ConstantRange(APInt::getSignedMinValue(BitWidth), - APInt(BitWidth, 1)), RangeType); + getSignedRangeMax(AddRec->getStart()) + 1), RangeType); } // TODO: non-affine addrec Index: llvm/test/Analysis/ScalarEvolution/range_nw_flag.ll =================================================================== --- llvm/test/Analysis/ScalarEvolution/range_nw_flag.ll +++ llvm/test/Analysis/ScalarEvolution/range_nw_flag.ll @@ -40,7 +40,7 @@ } ; CHECK-LABEL: @test-addrec-nsw -; CHECK: --> {(-1 + (-10 smin %offset)),+,-1}<%loop> U: [-2147483648,1) S: [-2147483648,1) +; CHECK: --> {(-1 + (-10 smin %offset)),+,-1}<%loop> U: [-2147483648,-10) S: [-2147483648,-10) define void @test-addrec-nsw(float* %input, i32 %offset, i32 %numIterations) { entry: %cmp = icmp slt i32 %offset, -10