]> granicus.if.org Git - llvm/commitdiff
[ProfileSummary] Count callsite samples when computing total samples.
authorTaewook Oh <twoh@fb.com>
Wed, 3 Apr 2019 19:54:43 +0000 (19:54 +0000)
committerTaewook Oh <twoh@fb.com>
Wed, 3 Apr 2019 19:54:43 +0000 (19:54 +0000)
Summary: Currently ProfileSummaryBuilder doesn't count into callsite samples when computing total samples. Considering that ProfileSummaryInfo is used to checked the hotness of not only body samples but also callsite samples (from SampleProfileLoader), I think the callsite sample counts should be considered when computing total samples.

Reviewers: eraman, danielcdh, wmi

Subscribers: hiraditya, jdoerfert, llvm-commits

Tags: #llvm

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357627 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ProfileData/ProfileCommon.h
lib/ProfileData/ProfileSummaryBuilder.cpp
test/Transforms/SampleProfile/Inputs/inline.compactbinary.afdo
test/Transforms/SampleProfile/Inputs/summary.prof
test/Transforms/SampleProfile/compact-binary-profile.ll
test/Transforms/SampleProfile/summary.ll

index b52f88643206208095bef7269b97840b20bc51e3..f98a34387fdf457617f818d9fc43891010ffb145 100644 (file)
@@ -83,7 +83,8 @@ public:
   SampleProfileSummaryBuilder(std::vector<uint32_t> Cutoffs)
       : ProfileSummaryBuilder(std::move(Cutoffs)) {}
 
-  void addRecord(const sampleprof::FunctionSamples &FS);
+  void addRecord(const sampleprof::FunctionSamples &FS,
+                 bool isCallsiteSample = false);
   std::unique_ptr<ProfileSummary> getSummary();
 };
 
index 35ac5b90cd1d3bac23379829adc255da342c7790..4d5b00935742b6d6de6bc64523df324c9aaf7b2c 100644 (file)
@@ -44,12 +44,17 @@ void InstrProfSummaryBuilder::addRecord(const InstrProfRecord &R) {
 // To compute the detailed summary, we consider each line containing samples as
 // equivalent to a block with a count in the instrumented profile.
 void SampleProfileSummaryBuilder::addRecord(
-    const sampleprof::FunctionSamples &FS) {
-  NumFunctions++;
-  if (FS.getHeadSamples() > MaxFunctionCount)
-    MaxFunctionCount = FS.getHeadSamples();
+    const sampleprof::FunctionSamples &FS, bool isCallsiteSample) {
+  if (!isCallsiteSample) {
+    NumFunctions++;
+    if (FS.getHeadSamples() > MaxFunctionCount)
+      MaxFunctionCount = FS.getHeadSamples();
+  }
   for (const auto &I : FS.getBodySamples())
     addCount(I.second.getSamples());
+  for (const auto &I : FS.getCallsiteSamples())
+    for (const auto &CS : I.second)
+      addRecord(CS.second, true);
 }
 
 // The argument to this method is a vector of cutoff percentages and the return
index 6271b3609e90c2e33b9e98dfc9feb31e067ce5c4..c9fde769982810d20a8b9f3173311c0d7fbeccaf 100644 (file)
Binary files a/test/Transforms/SampleProfile/Inputs/inline.compactbinary.afdo and b/test/Transforms/SampleProfile/Inputs/inline.compactbinary.afdo differ
index 49a5b57d5e64ba3753e4ea8a6d55e7f75b62029a..e80b9bc171bc9c4c4a1006afe5debc229dd6252f 100644 (file)
@@ -2,3 +2,8 @@ bar:100:3
  1: 100
 foo:200:1
  1: 200
+baz:600:1
+ 1: 0
+ 2: 300
+ 1: bar:300
+  1: 300
index 9b786ef1d71c817e4d6b00710b647cc3d5358a09..3b0a2a47c31a0889a9b6e50e3aa01fa0a701f461 100644 (file)
@@ -26,7 +26,7 @@
 ; CHECK: br i1 %cmp, label %while.body, label %while.end{{.*}} !prof ![[IDX1:[0-9]*]]
 ; CHECK: br i1 %cmp1, label %if.then, label %if.else{{.*}} !prof ![[IDX2:[0-9]*]]
 ; CHECK: call i32 (i8*, ...) @printf{{.*}} !prof ![[IDX3:[0-9]*]]
-; CHECK: = !{!"TotalCount", i64 10944}
+; CHECK: = !{!"TotalCount", i64 26781}
 ; CHECK: = !{!"MaxCount", i64 5553}
 ; CHECK: ![[IDX1]] = !{!"branch_weights", i32 5392, i32 163}
 ; CHECK: ![[IDX2]] = !{!"branch_weights", i32 5280, i32 113}
index 0a3d1a276480036dad3c41de8bb8fccbb12e3fd7..03b6644eacc8237948cc0215be0907cc07a90230 100644 (file)
@@ -7,9 +7,20 @@ entry:
   ret i32 1, !dbg !2
 }
 
+define i32 @baz() !dbg !3 {
+entry:
+    %call = call i32 @bar(), !dbg !4
+    ret i32 %call, !dbg !5
+}
+
 ; CHECK-DAG: {{![0-9]+}} = !{i32 1, !"ProfileSummary", {{![0-9]+}}}
-; CHECK-DAG: {{![0-9]+}} = !{!"NumFunctions", i64 2}
+; CHECK-DAG: {{![0-9]+}} = !{!"TotalCount", i64 900}
+; CHECK-DAG: {{![0-9]+}} = !{!"NumCounts", i64 5}
+; CHECK-DAG: {{![0-9]+}} = !{!"NumFunctions", i64 3}
 ; CHECK-DAG: {{![0-9]+}} = !{!"MaxFunctionCount", i64 3}
 
 !1 = distinct !DISubprogram(name: "bar")
 !2 = !DILocation(line: 2, scope: !2)
+!3 = distinct !DISubprogram(name: "baz")
+!4 = !DILocation(line: 1, scope: !4)
+!5 = !DILocation(line: 2, scope: !5)