Index: llvm/lib/Analysis/ScalarEvolution.cpp =================================================================== --- llvm/lib/Analysis/ScalarEvolution.cpp +++ llvm/lib/Analysis/ScalarEvolution.cpp @@ -11296,8 +11296,7 @@ if (!IV || IV->getLoop() != L || !IV->isAffine()) return getCouldNotCompute(); - bool NoWrap = ControlsExit && - IV->getNoWrapFlags(IsSigned ? SCEV::FlagNSW : SCEV::FlagNUW); + bool NoWrap = IV->getNoWrapFlags(IsSigned ? SCEV::FlagNSW : SCEV::FlagNUW); const SCEV *Stride = IV->getStepRecurrence(*this); @@ -11442,8 +11441,7 @@ if (!IV || IV->getLoop() != L || !IV->isAffine()) return getCouldNotCompute(); - bool NoWrap = ControlsExit && - IV->getNoWrapFlags(IsSigned ? SCEV::FlagNSW : SCEV::FlagNUW); + bool NoWrap = IV->getNoWrapFlags(IsSigned ? SCEV::FlagNSW : SCEV::FlagNUW); const SCEV *Stride = getNegativeSCEV(IV->getStepRecurrence(*this)); Index: llvm/test/Analysis/ScalarEvolution/trip-count-non-unit-stride.ll =================================================================== --- llvm/test/Analysis/ScalarEvolution/trip-count-non-unit-stride.ll +++ llvm/test/Analysis/ScalarEvolution/trip-count-non-unit-stride.ll @@ -13,9 +13,9 @@ ; CHECK-NEXT: --> {2,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <> LoopDispositions: { %loop: Computable } ; CHECK-NEXT: Determining loop execution counts for: @test_preinc_ult ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. -; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** +; CHECK-NEXT: exit count for loop: ((1 + %len) /u 2) ; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE*** -; CHECK-NEXT: Loop %loop: Unpredictable max backedge-taken count. +; CHECK-NEXT: Loop %loop: max backedge-taken count is 9223372036854775807 ; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count. ; start: @@ -46,9 +46,9 @@ ; CHECK-NEXT: --> {2,+,2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <> LoopDispositions: { %loop: Computable } ; CHECK-NEXT: Determining loop execution counts for: @test_postinc_ult ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. -; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** +; CHECK-NEXT: exit count for loop: ((1 umax %len) /u 2) ; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE*** -; CHECK-NEXT: Loop %loop: Unpredictable max backedge-taken count. +; CHECK-NEXT: Loop %loop: max backedge-taken count is 9223372036854775807 ; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count. ; start: @@ -73,14 +73,14 @@ ; CHECK-LABEL: 'test_preinc_slt' ; CHECK-NEXT: Classifying expressions for: @test_preinc_slt ; CHECK-NEXT: %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ] -; CHECK-NEXT: --> {0,+,2}<%loop> U: [0,-9223372036854775808) S: [0,9223372036854775807) Exits: <> LoopDispositions: { %loop: Computable } +; CHECK-NEXT: --> {0,+,2}<%loop> U: [0,9223372036854775807) S: [0,9223372036854775807) Exits: <> LoopDispositions: { %loop: Computable } ; CHECK-NEXT: %iv.inc2 = add nsw i64 %iv, 2 -; CHECK-NEXT: --> {2,+,2}<%loop> U: [2,-1) S: [-9223372036854775808,9223372036854775807) Exits: <> LoopDispositions: { %loop: Computable } +; CHECK-NEXT: --> {2,+,2}<%loop> U: [2,-9223372036854775807) S: [-9223372036854775808,9223372036854775807) Exits: <> LoopDispositions: { %loop: Computable } ; CHECK-NEXT: Determining loop execution counts for: @test_preinc_slt ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. -; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** +; CHECK-NEXT: exit count for loop: ((1 + (0 smax %len)) /u 2) ; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE*** -; CHECK-NEXT: Loop %loop: Unpredictable max backedge-taken count. +; CHECK-NEXT: Loop %loop: max backedge-taken count is 4611686018427387903 ; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count. ; start: @@ -104,16 +104,16 @@ ; CHECK-LABEL: 'test_postinc_slt' ; CHECK-NEXT: Classifying expressions for: @test_postinc_slt ; CHECK-NEXT: %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ] -; CHECK-NEXT: --> {0,+,2}<%loop> U: [0,-9223372036854775808) S: [0,9223372036854775807) Exits: <> LoopDispositions: { %loop: Computable } +; CHECK-NEXT: --> {0,+,2}<%loop> U: [0,9223372036854775807) S: [0,9223372036854775807) Exits: <> LoopDispositions: { %loop: Computable } ; CHECK-NEXT: %iv.inc = add nsw i64 %iv, 1 ; CHECK-NEXT: --> {1,+,2}<%loop> U: [1,-9223372036854775808) S: [1,-9223372036854775808) Exits: <> LoopDispositions: { %loop: Computable } ; CHECK-NEXT: %iv.inc2 = add nsw i64 %iv, 2 -; CHECK-NEXT: --> {2,+,2}<%loop> U: [2,-1) S: [-9223372036854775808,9223372036854775807) Exits: <> LoopDispositions: { %loop: Computable } +; CHECK-NEXT: --> {2,+,2}<%loop> U: [2,-9223372036854775807) S: [-9223372036854775808,9223372036854775807) Exits: <> LoopDispositions: { %loop: Computable } ; CHECK-NEXT: Determining loop execution counts for: @test_postinc_slt ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. -; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** +; CHECK-NEXT: exit count for loop: ((1 smax %len) /u 2) ; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE*** -; CHECK-NEXT: Loop %loop: Unpredictable max backedge-taken count. +; CHECK-NEXT: Loop %loop: max backedge-taken count is 4611686018427387903 ; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count. ; start: @@ -140,12 +140,12 @@ ; CHECK-NEXT: %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ] ; CHECK-NEXT: --> {0,+,-2}<%loop> U: [0,-1) S: [-9223372036854775808,1) Exits: <> LoopDispositions: { %loop: Computable } ; CHECK-NEXT: %iv.inc2 = add nsw i64 %iv, -2 -; CHECK-NEXT: --> {-2,+,-2}<%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <> LoopDispositions: { %loop: Computable } +; CHECK-NEXT: --> {-2,+,-2}<%loop> U: [9223372036854775806,-1) S: [-9223372036854775808,9223372036854775807) Exits: <> LoopDispositions: { %loop: Computable } ; CHECK-NEXT: Determining loop execution counts for: @test_preinc_sgt ; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. -; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** +; CHECK-NEXT: exit count for loop: ((1 + (-1 * (0 smin %lim))) /u 2) ; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE*** -; CHECK-NEXT: Loop %loop: Unpredictable max backedge-taken count. +; CHECK-NEXT: Loop %loop: max backedge-taken count is 4611686018427387904 ; CHECK-NEXT: Loop %loop: Unpredictable predicated backedge-taken count. ; start: