[clang] 91892e8 - [InstrProf] Add frontend temporal profiling flag (#122385)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 10 13:19:37 PST 2025
Author: Ellis Hoag
Date: 2025-01-10T13:19:33-08:00
New Revision: 91892e8fa3830ed6590eda0bc62e2a2ea8df8872
URL: https://github.com/llvm/llvm-project/commit/91892e8fa3830ed6590eda0bc62e2a2ea8df8872
DIFF: https://github.com/llvm/llvm-project/commit/91892e8fa3830ed6590eda0bc62e2a2ea8df8872.diff
LOG: [InstrProf] Add frontend temporal profiling flag (#122385)
As discussed in https://github.com/llvm/llvm-project/pull/121514 add the
frontend flag `-ftemporal-profile` to enable temporal profiling
(https://discourse.llvm.org/t/rfc-temporal-profiling-extension-for-irpgo/68068)
as a replacement for `-forder-file-instrumentation`
(https://discourse.llvm.org/t/deprecate-forder-file-instrumentation-in-favor-of-temporal-profiling/83903)
Added:
clang/test/Driver/fprofile-generate-temporal.c
Modified:
clang/docs/UsersManual.rst
clang/include/clang/Driver/Options.td
clang/lib/Driver/ToolChains/Clang.cpp
clang/test/Driver/clang_f_opts.c
Removed:
################################################################################
diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst
index 8af9f5be644a02..f58fca465c5494 100644
--- a/clang/docs/UsersManual.rst
+++ b/clang/docs/UsersManual.rst
@@ -3035,6 +3035,38 @@ indexed format, regardeless whether it is produced by frontend or the IR pass.
overhead. ``prefer-atomic`` will be transformed to ``atomic`` when supported
by the target, or ``single`` otherwise.
+.. option:: -ftemporal-profile
+
+ Enables the temporal profiling extension for IRPGO to improve startup time by
+ reducing ``.text`` section page faults. To do this, we instrument function
+ timestamps to measure when each function is called for the first time and use
+ this data to generate a function order to improve startup.
+
+ The profile is generated as normal.
+
+ .. code-block:: console
+
+ $ clang++ -O2 -fprofile-generate -ftemporal-profile code.cc -o code
+ $ ./code
+ $ llvm-profdata merge -o code.profdata yyy/zzz
+
+ Using the resulting profile, we can generate a function order to pass to the
+ linker via `--symbol-ordering-file` for ELF or `-order_file` for Mach-O.
+
+ .. code-block:: console
+
+ $ llvm-profdata order code.profdata -o code.orderfile
+ $ clang++ -O2 -Wl,--symbol-ordering-file=code.orderfile code.cc -o code
+
+ Or the profile can be passed to LLD directly.
+
+ .. code-block:: console
+
+ $ clang++ -O2 -fuse-ld=lld -Wl,--irpgo-profile=code.profdata,--bp-startup-sort=function code.cc -o code
+
+ For more information, please read the RFC:
+ https://discourse.llvm.org/t/rfc-temporal-profiling-extension-for-irpgo/68068
+
Fine Tuning Profile Collection
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index 41a7e8c3728066..80360216c9503a 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -1796,6 +1796,9 @@ def fprofile_generate_cold_function_coverage : Flag<["-"], "fprofile-generate-co
def fprofile_generate_cold_function_coverage_EQ : Joined<["-"], "fprofile-generate-cold-function-coverage=">,
Group<f_Group>, Visibility<[ClangOption, CLOption]>, MetaVarName<"<directory>">,
HelpText<"Generate instrumented code to collect coverage info for cold functions into <directory>/default.profraw (overridden by LLVM_PROFILE_FILE env var)">;
+def ftemporal_profile : Flag<["-"], "ftemporal-profile">,
+ Group<f_Group>, Visibility<[ClangOption, CLOption]>,
+ HelpText<"Generate instrumented code to collect temporal information">;
def fprofile_instr_generate : Flag<["-"], "fprofile-instr-generate">,
Group<f_Group>, Visibility<[ClangOption, CLOption]>,
HelpText<"Generate instrumented code to collect execution counts into default.profraw file (overridden by '=' form of option or LLVM_PROFILE_FILE env var)">;
@@ -1891,7 +1894,7 @@ defm pseudo_probe_for_profiling : BoolFOption<"pseudo-probe-for-profiling",
" pseudo probes for sample profiling">>;
def forder_file_instrumentation : Flag<["-"], "forder-file-instrumentation">,
Group<f_Group>, Visibility<[ClangOption, CC1Option, CLOption]>,
- HelpText<"Generate instrumented code to collect order file into default.profraw file (overridden by '=' form of option or LLVM_PROFILE_FILE env var). Deprecated, please use temporal profiling.">;
+ HelpText<"Generate instrumented code to collect order file into default.profraw file (overridden by '=' form of option or LLVM_PROFILE_FILE env var). Deprecated, please use -ftemporal-profile">;
def fprofile_list_EQ : Joined<["-"], "fprofile-list=">,
Group<f_Group>, Visibility<[ClangOption, CC1Option, CLOption]>,
HelpText<"Filename defining the list of functions/files to instrument. "
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index f81691f8aeaf95..33f08cf28feca1 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -662,6 +662,14 @@ static void addPGOAndCoverageFlags(const ToolChain &TC, Compilation &C,
CmdArgs.push_back("--pgo-function-entry-coverage");
}
+ if (auto *A = Args.getLastArg(options::OPT_ftemporal_profile)) {
+ if (!PGOGenerateArg && !CSPGOGenerateArg)
+ D.Diag(clang::diag::err_drv_argument_only_allowed_with)
+ << A->getSpelling() << "-fprofile-generate or -fcs-profile-generate";
+ CmdArgs.push_back("-mllvm");
+ CmdArgs.push_back("--pgo-temporal-instrumentation");
+ }
+
Arg *PGOGenArg = nullptr;
if (PGOGenerateArg) {
assert(!CSPGOGenerateArg);
@@ -8054,7 +8062,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Args.getLastArg(options::OPT_forder_file_instrumentation)) {
D.Diag(diag::warn_drv_deprecated_arg)
<< A->getAsString(Args) << /*hasReplacement=*/true
- << "-mllvm -pgo-temporal-instrumentation";
+ << "-ftemporal-profile";
CmdArgs.push_back("-forder-file-instrumentation");
// Enable order file instrumentation when ThinLTO is not on. When ThinLTO is
// on, we need to pass these flags as linker flags and that will be handled
diff --git a/clang/test/Driver/clang_f_opts.c b/clang/test/Driver/clang_f_opts.c
index 2b72068eae1eeb..38f25898c95568 100644
--- a/clang/test/Driver/clang_f_opts.c
+++ b/clang/test/Driver/clang_f_opts.c
@@ -424,7 +424,7 @@
// CHECK-WARNING-DAG: optimization flag '-fno-devirtualize-speculatively' is not supported
// CHECK-WARNING-DAG: the flag '-fslp-vectorize-aggressive' has been deprecated and will be ignored
// CHECK-WARNING-DAG: the flag '-fno-slp-vectorize-aggressive' has been deprecated and will be ignored
-// CHECK-WARNING-DAG: argument '-forder-file-instrumentation' is deprecated, use '-mllvm -pgo-temporal-instrumentation' instead
+// CHECK-WARNING-DAG: argument '-forder-file-instrumentation' is deprecated, use '-ftemporal-profile' instead
// Test that we mute the warning on these
// RUN: %clang -### -finline-limit=1000 -Wno-invalid-command-line-argument \
diff --git a/clang/test/Driver/fprofile-generate-temporal.c b/clang/test/Driver/fprofile-generate-temporal.c
new file mode 100644
index 00000000000000..8661dc6f8f2626
--- /dev/null
+++ b/clang/test/Driver/fprofile-generate-temporal.c
@@ -0,0 +1,7 @@
+// RUN: %clang -### -c -fprofile-generate -ftemporal-profile %s 2>&1 | FileCheck %s
+// RUN: %clang -### -c -fcs-profile-generate -ftemporal-profile %s 2>&1 | FileCheck %s
+// RUN: not %clang -### -c -ftemporal-profile %s 2>&1 | FileCheck %s --check-prefix=ERR
+
+// CHECK: "-mllvm" "--pgo-temporal-instrumentation"
+
+// ERR: error: invalid argument '-ftemporal-profile' only allowed with '-fprofile-generate or -fcs-profile-generate'
More information about the cfe-commits
mailing list