From 2b32e0123f52d49684d9cae9f0210a796e8f021a Mon Sep 17 00:00:00 2001 From: Taewook Oh Date: Tue, 2 Apr 2019 15:48:21 +0000 Subject: [PATCH] [SampleProfile] Repeat indirect call promotion only when the target is actually hot. Summary: 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. Reviewers: danielcdh, wmi Subscribers: hiraditya, jdoerfert, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D59940 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357484 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/SampleProfile.cpp | 3 ++ .../Inputs/cold-indirect-call.prof | 6 ++++ .../SampleProfile/cold-indirect-call.ll | 31 +++++++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 test/Transforms/SampleProfile/Inputs/cold-indirect-call.prof create mode 100644 test/Transforms/SampleProfile/cold-indirect-call.ll diff --git a/lib/Transforms/IPO/SampleProfile.cpp b/lib/Transforms/IPO/SampleProfile.cpp index f3bad362237..b6ea014e79f 100644 --- a/lib/Transforms/IPO/SampleProfile.cpp +++ b/lib/Transforms/IPO/SampleProfile.cpp @@ -834,6 +834,9 @@ bool SampleProfileLoader::inlineHotFunctions( 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() && diff --git a/test/Transforms/SampleProfile/Inputs/cold-indirect-call.prof b/test/Transforms/SampleProfile/Inputs/cold-indirect-call.prof new file mode 100644 index 00000000000..636ed7e0068 --- /dev/null +++ b/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 diff --git a/test/Transforms/SampleProfile/cold-indirect-call.ll b/test/Transforms/SampleProfile/cold-indirect-call.ll new file mode 100644 index 00000000000..b8a61e07ae7 --- /dev/null +++ b/test/Transforms/SampleProfile/cold-indirect-call.ll @@ -0,0 +1,31 @@ +; RUN: opt < %s -sample-profile -sample-profile-file=%S/Inputs/cold-indirect-call.prof -S | FileCheck %s +; RUN: opt < %s -passes=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) -- 2.50.1