mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 10:42:39 +01:00
[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:
parent
42d691190d
commit
89a18d93a9
@ -573,7 +573,9 @@ BlockFrequencyInfoImplBase::getProfileCountFromFreq(const Function &F,
|
||||
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();
|
||||
}
|
||||
|
||||
|
@ -146,19 +146,19 @@ indirectgoto: ; preds = %if.then18, %if.then
|
||||
; 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
|
||||
|
@ -38,4 +38,4 @@ B:
|
||||
; 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}
|
||||
|
@ -77,8 +77,10 @@ TEST_F(BlockFrequencyInfoTest, Basic) {
|
||||
|
||||
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<BasicBlock *, 4> BlocksToScale({BB1, BB2});
|
||||
|
Loading…
Reference in New Issue
Block a user