[lld] [LLD] [COFF] Port -lto-sample-profile to COFF version of LLD (PR #85701)

via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 18 19:42:06 PDT 2024


https://github.com/chrulski-intel updated https://github.com/llvm/llvm-project/pull/85701

>From a21830d9aba292785d1f79f292130f526e743985 Mon Sep 17 00:00:00 2001
From: chrulski-intel <christopher.m.chrulski at intel.com>
Date: Mon, 18 Mar 2024 08:44:11 -0700
Subject: [PATCH 1/2] [LLD] [COFF] Port -lto-sample-profile to COFF version of
 LLD

Following the commit of https://github.com/llvm/llvm-project/pull/83972 which
added COFF support for SPGO, this patch ports the support of the option
-lto-sample-profile that was only available in the ELF variant of LLD to the
COFF variant to enable SPGO passes of the LTO/thinLTO pipelines.
---
 lld/COFF/Config.h                        |  3 +++
 lld/COFF/Driver.cpp                      |  1 +
 lld/COFF/LTO.cpp                         |  1 +
 lld/COFF/Options.td                      |  1 +
 lld/test/COFF/Inputs/sample-profile.prof |  1 +
 lld/test/COFF/sample-profile.ll          | 23 +++++++++++++++++++++++
 6 files changed, 30 insertions(+)
 create mode 100644 lld/test/COFF/Inputs/sample-profile.prof
 create mode 100644 lld/test/COFF/sample-profile.ll

diff --git a/lld/COFF/Config.h b/lld/COFF/Config.h
index 018f03b211e422..8f85929f1bea7f 100644
--- a/lld/COFF/Config.h
+++ b/lld/COFF/Config.h
@@ -263,6 +263,9 @@ struct Configuration {
   // Used for /lto-pgo-warn-mismatch:
   bool ltoPGOWarnMismatch = true;
 
+  // Used for /lto-sample-profile:
+  llvm::StringRef ltoSampleProfileName;
+
   // Used for /call-graph-ordering-file:
   llvm::MapVector<std::pair<const SectionChunk *, const SectionChunk *>,
                   uint64_t>
diff --git a/lld/COFF/Driver.cpp b/lld/COFF/Driver.cpp
index 22ee2f133be98a..1b075389325a91 100644
--- a/lld/COFF/Driver.cpp
+++ b/lld/COFF/Driver.cpp
@@ -2028,6 +2028,7 @@ void LinkerDriver::linkerMain(ArrayRef<const char *> argsArr) {
   config->ltoObjPath = args.getLastArgValue(OPT_lto_obj_path);
   config->ltoCSProfileGenerate = args.hasArg(OPT_lto_cs_profile_generate);
   config->ltoCSProfileFile = args.getLastArgValue(OPT_lto_cs_profile_file);
+  config->ltoSampleProfileName = args.getLastArgValue(OPT_lto_sample_profile);
   // Handle miscellaneous boolean flags.
   config->ltoPGOWarnMismatch = args.hasFlag(OPT_lto_pgo_warn_mismatch,
                                             OPT_lto_pgo_warn_mismatch_no, true);
diff --git a/lld/COFF/LTO.cpp b/lld/COFF/LTO.cpp
index 7df93191121367..be49aa6e8bb3da 100644
--- a/lld/COFF/LTO.cpp
+++ b/lld/COFF/LTO.cpp
@@ -86,6 +86,7 @@ lto::Config BitcodeCompiler::createConfig() {
   c.CSIRProfile = std::string(ctx.config.ltoCSProfileFile);
   c.RunCSIRInstr = ctx.config.ltoCSProfileGenerate;
   c.PGOWarnMismatch = ctx.config.ltoPGOWarnMismatch;
+  c.SampleProfile = ctx.config.ltoSampleProfileName;
   c.TimeTraceEnabled = ctx.config.timeTraceEnabled;
   c.TimeTraceGranularity = ctx.config.timeTraceGranularity;
 
diff --git a/lld/COFF/Options.td b/lld/COFF/Options.td
index 4dab4a20717392..1e78a560bca864 100644
--- a/lld/COFF/Options.td
+++ b/lld/COFF/Options.td
@@ -79,6 +79,7 @@ def lldltocachepolicy : P<"lldltocachepolicy",
     "Pruning policy for the ThinLTO cache">;
 def lldsavetemps : F<"lldsavetemps">,
     HelpText<"Save intermediate LTO compilation results">;
+def lto_sample_profile: P<"lto-sample-profile", "Sample profile file path">;
 def machine : P<"machine", "Specify target platform">;
 def merge   : P<"merge", "Combine sections">;
 def mllvm   : P<"mllvm", "Options to pass to LLVM">;
diff --git a/lld/test/COFF/Inputs/sample-profile.prof b/lld/test/COFF/Inputs/sample-profile.prof
new file mode 100644
index 00000000000000..0ccd747bd376f8
--- /dev/null
+++ b/lld/test/COFF/Inputs/sample-profile.prof
@@ -0,0 +1 @@
+f:0:0
diff --git a/lld/test/COFF/sample-profile.ll b/lld/test/COFF/sample-profile.ll
new file mode 100644
index 00000000000000..4cf0b55e3688d0
--- /dev/null
+++ b/lld/test/COFF/sample-profile.ll
@@ -0,0 +1,23 @@
+; REQUIRES: x86
+; RUN: opt -module-summary %s -o %t1.o
+; RUN: opt -module-summary %p/Inputs/thinlto.ll -o %t2.o
+
+; RUN: rm -f %t1.o.4.opt.bc
+; RUN: lld-link /lto-sample-profile:%p/Inputs/sample-profile.prof /lldsavetemps /entry:f /subsystem:console %t1.o %t2.o /out:%t3.exe
+; RUN: opt -S %t1.o.4.opt.bc | FileCheck %s
+
+target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-pc-windows-msvc19.0.24215"
+
+; CHECK: ![[#]] = !{i32 1, !"ProfileSummary", ![[#]]}
+declare void @g(...)
+
+define void @h() {
+  ret void
+}
+define void @f() {
+entry:
+  call void (...) @g()
+  call void (...) @h()
+  ret void
+}

>From b25cdc0c95f8797d8d05f57e481de2d6fa3e3bfd Mon Sep 17 00:00:00 2001
From: chrulski-intel <christopher.m.chrulski at intel.com>
Date: Mon, 18 Mar 2024 19:38:08 -0700
Subject: [PATCH 2/2] Renamed testcase files to have 'lto-' prefix

---
 .../Inputs/{sample-profile.prof => lto-sample-profile.prof}     | 0
 lld/test/COFF/{sample-profile.ll => lto-sample-profile.ll}      | 2 +-
 2 files changed, 1 insertion(+), 1 deletion(-)
 rename lld/test/COFF/Inputs/{sample-profile.prof => lto-sample-profile.prof} (100%)
 rename lld/test/COFF/{sample-profile.ll => lto-sample-profile.ll} (79%)

diff --git a/lld/test/COFF/Inputs/sample-profile.prof b/lld/test/COFF/Inputs/lto-sample-profile.prof
similarity index 100%
rename from lld/test/COFF/Inputs/sample-profile.prof
rename to lld/test/COFF/Inputs/lto-sample-profile.prof
diff --git a/lld/test/COFF/sample-profile.ll b/lld/test/COFF/lto-sample-profile.ll
similarity index 79%
rename from lld/test/COFF/sample-profile.ll
rename to lld/test/COFF/lto-sample-profile.ll
index 4cf0b55e3688d0..64d4c8ab632885 100644
--- a/lld/test/COFF/sample-profile.ll
+++ b/lld/test/COFF/lto-sample-profile.ll
@@ -3,7 +3,7 @@
 ; RUN: opt -module-summary %p/Inputs/thinlto.ll -o %t2.o
 
 ; RUN: rm -f %t1.o.4.opt.bc
-; RUN: lld-link /lto-sample-profile:%p/Inputs/sample-profile.prof /lldsavetemps /entry:f /subsystem:console %t1.o %t2.o /out:%t3.exe
+; RUN: lld-link /lto-sample-profile:%p/Inputs/lto-sample-profile.prof /lldsavetemps /entry:f /subsystem:console %t1.o %t2.o /out:%t3.exe
 ; RUN: opt -S %t1.o.4.opt.bc | FileCheck %s
 
 target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"



More information about the llvm-commits mailing list