diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp --- a/llvm/lib/Transforms/Utils/LoopUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp @@ -723,12 +723,15 @@ if (LatchBR->getSuccessor(0) != L->getHeader()) std::swap(BackedgeTakenWeight, LatchExitWeight); - if (!BackedgeTakenWeight || !LatchExitWeight) - return 0; + if (!LatchExitWeight) + return None; - // Divide the count of the backedge by the count of the edge exiting the loop, - // rounding to nearest. - return llvm::divideNearest(BackedgeTakenWeight, LatchExitWeight); + // Estimated backedge taken count is a ratio of the backedge taken weight by + // the the edge exiting weight, rounded to nearest. + uint64_t BackedgeTakenCount = + llvm::divideNearest(BackedgeTakenWeight, LatchExitWeight); + // Estimated trip count is one plus estimated backedge taken count. + return BackedgeTakenCount + 1; } bool llvm::hasIterationCountInvariantInParent(Loop *InnerLoop, diff --git a/llvm/test/Transforms/LoopUnroll/peel-loop-conditions-pgo-1.ll b/llvm/test/Transforms/LoopUnroll/peel-loop-conditions-pgo-1.ll --- a/llvm/test/Transforms/LoopUnroll/peel-loop-conditions-pgo-1.ll +++ b/llvm/test/Transforms/LoopUnroll/peel-loop-conditions-pgo-1.ll @@ -11,7 +11,7 @@ define void @test1(i32 %k) !prof !4 { ; CHECK: Loop Unroll: F[test1] Loop %for.body ; CHECK: PEELING loop %for.body with iteration count 2! -; CHECK: PEELING loop %for.body with iteration count 4! +; CHECK: PEELING loop %for.body with iteration count 5! ; CHECK: llvm.loop.unroll.disable for.body.lr.ph: br label %for.body diff --git a/llvm/test/Transforms/LoopUnroll/peel-loop-pgo-deopt-idom-2.ll b/llvm/test/Transforms/LoopUnroll/peel-loop-pgo-deopt-idom-2.ll --- a/llvm/test/Transforms/LoopUnroll/peel-loop-pgo-deopt-idom-2.ll +++ b/llvm/test/Transforms/LoopUnroll/peel-loop-pgo-deopt-idom-2.ll @@ -5,7 +5,7 @@ ; Regression test for setting the correct idom for exit blocks. ; CHECK: Loop Unroll: F[basic] -; CHECK: PEELING loop %for.body with iteration count 1! +; CHECK: PEELING loop %for.body with iteration count 2! define i32 @basic(i32* %p, i32 %k, i1 %c1, i1 %c2) #0 !prof !3 { entry: diff --git a/llvm/test/Transforms/LoopUnroll/peel-loop-pgo-deopt-idom.ll b/llvm/test/Transforms/LoopUnroll/peel-loop-pgo-deopt-idom.ll --- a/llvm/test/Transforms/LoopUnroll/peel-loop-pgo-deopt-idom.ll +++ b/llvm/test/Transforms/LoopUnroll/peel-loop-pgo-deopt-idom.ll @@ -5,7 +5,7 @@ ; Regression test for setting the correct idom for exit blocks. ; CHECK: Loop Unroll: F[basic] -; CHECK: PEELING loop %for.body with iteration count 1! +; CHECK: PEELING loop %for.body with iteration count 2! define i32 @basic(i32* %p, i32 %k, i1 %c1, i1 %c2) #0 !prof !3 { entry: diff --git a/llvm/test/Transforms/LoopUnroll/peel-loop-pgo-deopt.ll b/llvm/test/Transforms/LoopUnroll/peel-loop-pgo-deopt.ll --- a/llvm/test/Transforms/LoopUnroll/peel-loop-pgo-deopt.ll +++ b/llvm/test/Transforms/LoopUnroll/peel-loop-pgo-deopt.ll @@ -8,7 +8,7 @@ ; All side exits to deopt does not change weigths. ; CHECK: Loop Unroll: F[basic] -; CHECK: PEELING loop %for.body with iteration count 3! +; CHECK: PEELING loop %for.body with iteration count 4! ; CHECK-NO-PEEL-NOT: PEELING loop %for.body ; CHECK-LABEL: @basic ; CHECK: br i1 %c, label %{{.*}}, label %side_exit, !prof !15 diff --git a/llvm/test/Transforms/LoopUnroll/peel-loop-pgo.ll b/llvm/test/Transforms/LoopUnroll/peel-loop-pgo.ll --- a/llvm/test/Transforms/LoopUnroll/peel-loop-pgo.ll +++ b/llvm/test/Transforms/LoopUnroll/peel-loop-pgo.ll @@ -9,7 +9,7 @@ ; from the loop, and update the branch weights for the peeled loop properly. ; CHECK: Loop Unroll: F[basic] -; CHECK: PEELING loop %for.body with iteration count 3! +; CHECK: PEELING loop %for.body with iteration count 4! ; CHECK: Loop Unroll: F[optsize] ; CHECK-NOT: PEELING