Index: lib/Analysis/BlockFrequencyInfoImpl.cpp =================================================================== --- lib/Analysis/BlockFrequencyInfoImpl.cpp +++ lib/Analysis/BlockFrequencyInfoImpl.cpp @@ -573,7 +573,9 @@ APInt BlockFreq(128, Freq); APInt EntryFreq(128, getEntryFreq()); BlockCount *= BlockFreq; - BlockCount = BlockCount.udiv(EntryFreq); + // Rounded division of BlockCount by EntryFreq. Since EntryFreq is unsigned + // lshr by 1 gives EntryFreq/2. + BlockCount = (BlockCount + EntryFreq.lshr(1)).udiv(EntryFreq); return BlockCount.getLimitedValue(); } Index: test/Analysis/BlockFrequencyInfo/irreducible_pgo.ll =================================================================== --- test/Analysis/BlockFrequencyInfo/irreducible_pgo.ll +++ test/Analysis/BlockFrequencyInfo/irreducible_pgo.ll @@ -146,19 +146,19 @@ ; CHECK-NEXT: block-frequency-info: _Z11irreduciblePh ; CHECK-NEXT: - entry: {{.*}} count = 1 ; CHECK-NEXT: - for.cond1: {{.*}} count = 1 -; CHECK-NEXT: - dispatch_op: {{.*}} count = 201 -; CHECK-NEXT: - dispatch_op.sw.bb6_crit_edge: {{.*}} count = 200 -; CHECK-NEXT: - sw.bb: {{.*}} count = 0 -; CHECK-NEXT: - TARGET_1: {{.*}} count = 299 -; CHECK-NEXT: - sw.bb6: {{.*}} count = 500, irr_loop_header_weight = 501 -; CHECK-NEXT: - if.then: {{.*}} count = 299 -; CHECK-NEXT: - TARGET_2: {{.*}} count = 98 -; CHECK-NEXT: - sw.bb15: {{.*}} count = 99, irr_loop_header_weight = 100 -; CHECK-NEXT: - if.then18: {{.*}} count = 99 +; CHECK-NEXT: - dispatch_op: {{.*}} count = 202 +; CHECK-NEXT: - dispatch_op.sw.bb6_crit_edge: {{.*}} count = 201 +; CHECK-NEXT: - sw.bb: {{.*}} count = 1 +; CHECK-NEXT: - TARGET_1: {{.*}} count = 300 +; CHECK-NEXT: - sw.bb6: {{.*}} count = 501, irr_loop_header_weight = 501 +; CHECK-NEXT: - if.then: {{.*}} count = 300 +; CHECK-NEXT: - TARGET_2: {{.*}} count = 99 +; CHECK-NEXT: - sw.bb15: {{.*}} count = 100, irr_loop_header_weight = 100 +; CHECK-NEXT: - if.then18: {{.*}} count = 100 ; CHECK-NEXT: - unknown_op: {{.*}} count = 0 ; CHECK-NEXT: - sw.default: {{.*}} count = 0 ; CHECK-NEXT: - exit: {{.*}} count = 1 -; CHECK-NEXT: - indirectgoto: {{.*}} count = 399, irr_loop_header_weight = 400 +; CHECK-NEXT: - indirectgoto: {{.*}} count = 400, irr_loop_header_weight = 400 ; Missing some irr loop annotations. ; Function Attrs: noinline norecurse nounwind uwtable Index: test/Instrumentation/cgprofile.ll =================================================================== --- test/Instrumentation/cgprofile.ll +++ test/Instrumentation/cgprofile.ll @@ -38,4 +38,4 @@ ; CHECK: ![[e3]] = !{void (i1)* @freq, i32 ()* @func3, i64 150} ; CHECK: ![[e4]] = !{void (i1)* @freq, i32 ()* @func1, i64 10} ; CHECK: ![[e5]] = !{void (i1)* @freq, void ()* @a, i64 11} -; CHECK: ![[e6]] = !{void (i1)* @freq, void ()* @b, i64 20} +; CHECK: ![[e6]] = !{void (i1)* @freq, void ()* @b, i64 21} Index: unittests/Analysis/BlockFrequencyInfoTest.cpp =================================================================== --- unittests/Analysis/BlockFrequencyInfoTest.cpp +++ unittests/Analysis/BlockFrequencyInfoTest.cpp @@ -77,8 +77,10 @@ EXPECT_EQ(BFI.getBlockProfileCount(&BB0).getValue(), UINT64_C(100)); EXPECT_EQ(BFI.getBlockProfileCount(BB3).getValue(), UINT64_C(100)); - EXPECT_EQ(BFI.getBlockProfileCount(BB1).getValue(), 100 * BB1Freq / BB0Freq); - EXPECT_EQ(BFI.getBlockProfileCount(BB2).getValue(), 100 * BB2Freq / BB0Freq); + EXPECT_EQ(BFI.getBlockProfileCount(BB1).getValue(), + (100 * BB1Freq + BB0Freq / 2) / BB0Freq); + EXPECT_EQ(BFI.getBlockProfileCount(BB2).getValue(), + (100 * BB2Freq + BB0Freq / 2) / BB0Freq); // Scale the frequencies of BB0, BB1 and BB2 by a factor of two. SmallPtrSet BlocksToScale({BB1, BB2});