diff options
author | Easwaran Raman <eraman@google.com> | 2018-08-16 00:26:59 +0000 |
---|---|---|
committer | Easwaran Raman <eraman@google.com> | 2018-08-16 00:26:59 +0000 |
commit | aca738b7424189e4937295de9f297124cc07b10f (patch) | |
tree | 9d3a58d181b262aab095934f965e3d6d6e1f56c0 | |
parent | bc86a99f780fce86a2a214d896f5bc1afb1c9b74 (diff) | |
download | bcm5719-llvm-aca738b7424189e4937295de9f297124cc07b10f.tar.gz bcm5719-llvm-aca738b7424189e4937295de9f297124cc07b10f.zip |
[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
-rw-r--r-- | llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp | 4 | ||||
-rw-r--r-- | llvm/test/Analysis/BlockFrequencyInfo/irreducible_pgo.ll | 20 | ||||
-rw-r--r-- | llvm/test/Instrumentation/cgprofile.ll | 2 | ||||
-rw-r--r-- | llvm/unittests/Analysis/BlockFrequencyInfoTest.cpp | 6 |
4 files changed, 18 insertions, 14 deletions
diff --git a/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp b/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp index 3d095068e7f..98209888f8a 100644 --- a/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp +++ b/llvm/lib/Analysis/BlockFrequencyInfoImpl.cpp @@ -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(); } diff --git a/llvm/test/Analysis/BlockFrequencyInfo/irreducible_pgo.ll b/llvm/test/Analysis/BlockFrequencyInfo/irreducible_pgo.ll index 8a18cbaf896..9d5499771ec 100644 --- a/llvm/test/Analysis/BlockFrequencyInfo/irreducible_pgo.ll +++ b/llvm/test/Analysis/BlockFrequencyInfo/irreducible_pgo.ll @@ -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 diff --git a/llvm/test/Instrumentation/cgprofile.ll b/llvm/test/Instrumentation/cgprofile.ll index 6b77c60c6c5..1edf3b6ec51 100644 --- a/llvm/test/Instrumentation/cgprofile.ll +++ b/llvm/test/Instrumentation/cgprofile.ll @@ -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} diff --git a/llvm/unittests/Analysis/BlockFrequencyInfoTest.cpp b/llvm/unittests/Analysis/BlockFrequencyInfoTest.cpp index 6fad5c50cf4..cc053066a26 100644 --- a/llvm/unittests/Analysis/BlockFrequencyInfoTest.cpp +++ b/llvm/unittests/Analysis/BlockFrequencyInfoTest.cpp @@ -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}); |