[BFI] Use rounding while computing profile counts.

Summary:
Profile count of a block is computed by multiplying its block frequency
by entry count and dividing the result by entry block frequency. Do
rounded division in the last step and update test cases appropriately.

Reviewers: davidxl

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D50822

llvm-svn: 339835
This commit is contained in:
Easwaran Raman 2018-08-16 00:26:59 +00:00
parent 42d691190d
commit 89a18d93a9
4 changed files with 18 additions and 14 deletions

View File

@ -573,7 +573,9 @@ BlockFrequencyInfoImplBase::getProfileCountFromFreq(const Function &F,
APInt BlockFreq(128, Freq); APInt BlockFreq(128, Freq);
APInt EntryFreq(128, getEntryFreq()); APInt EntryFreq(128, getEntryFreq());
BlockCount *= BlockFreq; 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(); return BlockCount.getLimitedValue();
} }

View File

@ -146,19 +146,19 @@ indirectgoto: ; preds = %if.then18, %if.then
; CHECK-NEXT: block-frequency-info: _Z11irreduciblePh ; CHECK-NEXT: block-frequency-info: _Z11irreduciblePh
; CHECK-NEXT: - entry: {{.*}} count = 1 ; CHECK-NEXT: - entry: {{.*}} count = 1
; CHECK-NEXT: - for.cond1: {{.*}} count = 1 ; CHECK-NEXT: - for.cond1: {{.*}} count = 1
; CHECK-NEXT: - dispatch_op: {{.*}} count = 201 ; CHECK-NEXT: - dispatch_op: {{.*}} count = 202
; CHECK-NEXT: - dispatch_op.sw.bb6_crit_edge: {{.*}} count = 200 ; CHECK-NEXT: - dispatch_op.sw.bb6_crit_edge: {{.*}} count = 201
; CHECK-NEXT: - sw.bb: {{.*}} count = 0 ; CHECK-NEXT: - sw.bb: {{.*}} count = 1
; CHECK-NEXT: - TARGET_1: {{.*}} count = 299 ; CHECK-NEXT: - TARGET_1: {{.*}} count = 300
; CHECK-NEXT: - sw.bb6: {{.*}} count = 500, irr_loop_header_weight = 501 ; CHECK-NEXT: - sw.bb6: {{.*}} count = 501, irr_loop_header_weight = 501
; CHECK-NEXT: - if.then: {{.*}} count = 299 ; CHECK-NEXT: - if.then: {{.*}} count = 300
; CHECK-NEXT: - TARGET_2: {{.*}} count = 98 ; CHECK-NEXT: - TARGET_2: {{.*}} count = 99
; CHECK-NEXT: - sw.bb15: {{.*}} count = 99, irr_loop_header_weight = 100 ; CHECK-NEXT: - sw.bb15: {{.*}} count = 100, irr_loop_header_weight = 100
; CHECK-NEXT: - if.then18: {{.*}} count = 99 ; CHECK-NEXT: - if.then18: {{.*}} count = 100
; CHECK-NEXT: - unknown_op: {{.*}} count = 0 ; CHECK-NEXT: - unknown_op: {{.*}} count = 0
; CHECK-NEXT: - sw.default: {{.*}} count = 0 ; CHECK-NEXT: - sw.default: {{.*}} count = 0
; CHECK-NEXT: - exit: {{.*}} count = 1 ; 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. ; Missing some irr loop annotations.
; Function Attrs: noinline norecurse nounwind uwtable ; Function Attrs: noinline norecurse nounwind uwtable

View File

@ -38,4 +38,4 @@ B:
; CHECK: ![[e3]] = !{void (i1)* @freq, i32 ()* @func3, i64 150} ; CHECK: ![[e3]] = !{void (i1)* @freq, i32 ()* @func3, i64 150}
; CHECK: ![[e4]] = !{void (i1)* @freq, i32 ()* @func1, i64 10} ; CHECK: ![[e4]] = !{void (i1)* @freq, i32 ()* @func1, i64 10}
; CHECK: ![[e5]] = !{void (i1)* @freq, void ()* @a, i64 11} ; 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}

View File

@ -77,8 +77,10 @@ TEST_F(BlockFrequencyInfoTest, Basic) {
EXPECT_EQ(BFI.getBlockProfileCount(&BB0).getValue(), UINT64_C(100)); EXPECT_EQ(BFI.getBlockProfileCount(&BB0).getValue(), UINT64_C(100));
EXPECT_EQ(BFI.getBlockProfileCount(BB3).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(BB1).getValue(),
EXPECT_EQ(BFI.getBlockProfileCount(BB2).getValue(), 100 * BB2Freq / BB0Freq); (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. // Scale the frequencies of BB0, BB1 and BB2 by a factor of two.
SmallPtrSet<BasicBlock *, 4> BlocksToScale({BB1, BB2}); SmallPtrSet<BasicBlock *, 4> BlocksToScale({BB1, BB2});