[PATCH] D59940: [SampleProfile] Repeat indirect call promotion only when the target is actually hot.

Taewook Oh via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Mar 28 08:48:55 PDT 2019


twoh created this revision.
twoh added reviewers: danielcdh, wmi.
Herald added subscribers: jdoerfert, hiraditya.
Herald added a project: LLVM.

It is possible that multiple indirect call targets have been promoted for a single callsite from the profiled binary. Current implementation repeats promotion for all these targets as far as the callsite itself is hot (the callsite is assumed to be hot if any one of these targets was "hot" during the profiling). However, even when one of the ICPed target is hot other targets may not, and we should not repeat promotion for "cold" targets.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D59940

Files:
  llvm/lib/Transforms/IPO/SampleProfile.cpp
  llvm/test/Transforms/SampleProfile/Inputs/cold-indirect-call.prof
  llvm/test/Transforms/SampleProfile/cold-indirect-call.ll


Index: llvm/test/Transforms/SampleProfile/cold-indirect-call.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/SampleProfile/cold-indirect-call.ll
@@ -0,0 +1,32 @@
+; RUN: opt < %s -sample-profile -sample-profile-file=%S/Inputs/cold-indirect-call.prof -S | FileCheck %s
+
+define i32 @foo(i32 ()* %func) !dbg !3 {
+; CHECK: icmp {{.*}} @bar
+; CHECK-NOT: icmp {{.*}} @baz
+  %call = call i32 %func(), !dbg !4
+  ret i32 %call
+}
+
+define i32 @bar() !dbg !5 {
+  ret i32 41, !dbg !6
+}
+
+define i32 @baz() !dbg !7 {
+  ret i32 42, !dbg !8
+}
+
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!2}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1)
+!1 = !DIFile(filename: "foo.cc", directory: "/")
+!2 = !{i32 2, !"Debug Info Version", i32 3}
+!3 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 4, unit: !0)
+!4 = !DILocation(line: 5, scope: !3)
+!5 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 8, unit: !0)
+!6 = !DILocation(line: 9, scope: !5)
+!7 = distinct !DISubprogram(name: "baz", scope: !1, file: !1, line: 12, unit: !0)
+!8 = !DILocation(line: 13, scope: !7)
+!9 = distinct !DISubprogram(name: "quz", scope: !1, file: !1, line: 16, unit: !0)
+!10 = !DILocation(line: 17, scope: !9)
Index: llvm/test/Transforms/SampleProfile/Inputs/cold-indirect-call.prof
===================================================================
--- /dev/null
+++ llvm/test/Transforms/SampleProfile/Inputs/cold-indirect-call.prof
@@ -0,0 +1,6 @@
+foo:5000:1
+ 1: 2000 quz:1000
+ 1: bar:3000
+   1: 3000
+ 1: baz:0
+   1: 0
Index: llvm/lib/Transforms/IPO/SampleProfile.cpp
===================================================================
--- llvm/lib/Transforms/IPO/SampleProfile.cpp
+++ llvm/lib/Transforms/IPO/SampleProfile.cpp
@@ -834,6 +834,9 @@
           if (CalleeFunctionName == F.getName())
             continue;
 
+          if (!callsiteIsHot(FS, PSI))
+            continue;
+
           const char *Reason = "Callee function not available";
           auto R = SymbolMap.find(CalleeFunctionName);
           if (R != SymbolMap.end() && R->getValue() &&


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D59940.192646.patch
Type: text/x-patch
Size: 2174 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190328/33858e94/attachment.bin>


More information about the llvm-commits mailing list