[clang] 611ce24 - [PGO] Enable `-fprofile-update` for `-fprofile-generate`
Qiongsi Wu via cfe-commits
cfe-commits at lists.llvm.org
Tue Aug 15 07:12:41 PDT 2023
Author: Qiongsi Wu
Date: 2023-08-15T10:10:03-04:00
New Revision: 611ce24114aac1befac6e65d85b0daa721cf71fd
URL: https://github.com/llvm/llvm-project/commit/611ce24114aac1befac6e65d85b0daa721cf71fd
DIFF: https://github.com/llvm/llvm-project/commit/611ce24114aac1befac6e65d85b0daa721cf71fd.diff
LOG: [PGO] Enable `-fprofile-update` for `-fprofile-generate`
Currently, the `-fprofile-udpate` is ignored when `-fprofile-generate` is in effect. This patch enables `-fprofile-update` for `-fprofile-generate`. This patch continues the work from https://reviews.llvm.org/D87737, which added `-fprofile-update` in the first place.
Reviewed By: MaskRay
Differential Revision: https://reviews.llvm.org/D157280
Added:
Modified:
clang/docs/UsersManual.rst
clang/lib/CodeGen/BackendUtil.cpp
clang/test/CodeGen/tsan-instrprof-atomic.c
llvm/include/llvm/Passes/PassBuilder.h
llvm/include/llvm/Support/PGOOptions.h
llvm/lib/Passes/PassBuilderPipelines.cpp
llvm/lib/Support/PGOOptions.cpp
Removed:
################################################################################
diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst
index 558e205d69c2a3..d7854d3920f4a9 100644
--- a/clang/docs/UsersManual.rst
+++ b/clang/docs/UsersManual.rst
@@ -2759,9 +2759,6 @@ programs using the same instrumentation method as ``-fprofile-generate``.
overhead. ``prefer-atomic`` will be transformed to ``atomic`` when supported
by the target, or ``single`` otherwise.
- This option currently works with ``-fprofile-arcs`` and ``-fprofile-instr-generate``,
- but not with ``-fprofile-generate``.
-
Disabling Instrumentation
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp
index e902f7372f3ab5..3e8b2b78a3928b 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -768,7 +768,8 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
CodeGenOpts.InstrProfileOutput.empty() ? getDefaultProfileGenName()
: CodeGenOpts.InstrProfileOutput,
"", "", CodeGenOpts.MemoryProfileUsePath, nullptr, PGOOptions::IRInstr,
- PGOOptions::NoCSAction, CodeGenOpts.DebugInfoForProfiling);
+ PGOOptions::NoCSAction, CodeGenOpts.DebugInfoForProfiling,
+ /*PseudoProbeForProfiling=*/false, CodeGenOpts.AtomicProfileUpdate);
else if (CodeGenOpts.hasProfileIRUse()) {
// -fprofile-use.
auto CSAction = CodeGenOpts.hasProfileCSIRUse() ? PGOOptions::CSIRUse
diff --git a/clang/test/CodeGen/tsan-instrprof-atomic.c b/clang/test/CodeGen/tsan-instrprof-atomic.c
index 23402cffa46d8a..04ca7c08410992 100644
--- a/clang/test/CodeGen/tsan-instrprof-atomic.c
+++ b/clang/test/CodeGen/tsan-instrprof-atomic.c
@@ -1,4 +1,6 @@
// RUN: %clang_cc1 %s -emit-llvm -fprofile-instrument=clang -fprofile-update=atomic -o - | FileCheck %s
+// RUN: %clang %s -S -emit-llvm -fprofile-generate -fprofile-update=atomic -o - | FileCheck %s
+// RUN: %clang -O3 %s -S -emit-llvm -fprofile-generate -fprofile-update=atomic -o - | FileCheck %s
// CHECK: define {{.*}}@foo
// CHECK-NOT: load {{.*}}foo
diff --git a/llvm/include/llvm/Passes/PassBuilder.h b/llvm/include/llvm/Passes/PassBuilder.h
index fdb407263787f6..08c5b112d903a4 100644
--- a/llvm/include/llvm/Passes/PassBuilder.h
+++ b/llvm/include/llvm/Passes/PassBuilder.h
@@ -560,7 +560,8 @@ class PassBuilder {
/// Add PGOInstrumenation passes for O0 only.
void addPGOInstrPassesForO0(ModulePassManager &MPM, bool RunProfileGen,
- bool IsCS, std::string ProfileFile,
+ bool IsCS, bool AtomicCounterUpdate,
+ std::string ProfileFile,
std::string ProfileRemappingFile,
IntrusiveRefCntPtr<vfs::FileSystem> FS);
@@ -628,7 +629,8 @@ class PassBuilder {
ArrayRef<PipelineElement> Pipeline);
void addPGOInstrPasses(ModulePassManager &MPM, OptimizationLevel Level,
- bool RunProfileGen, bool IsCS, std::string ProfileFile,
+ bool RunProfileGen, bool IsCS,
+ bool AtomicCounterUpdate, std::string ProfileFile,
std::string ProfileRemappingFile,
ThinOrFullLTOPhase LTOPhase,
IntrusiveRefCntPtr<vfs::FileSystem> FS);
diff --git a/llvm/include/llvm/Support/PGOOptions.h b/llvm/include/llvm/Support/PGOOptions.h
index 35670c457745a5..87eb29a8de48a0 100644
--- a/llvm/include/llvm/Support/PGOOptions.h
+++ b/llvm/include/llvm/Support/PGOOptions.h
@@ -32,7 +32,8 @@ struct PGOOptions {
IntrusiveRefCntPtr<vfs::FileSystem> FS,
PGOAction Action = NoAction, CSPGOAction CSAction = NoCSAction,
bool DebugInfoForProfiling = false,
- bool PseudoProbeForProfiling = false);
+ bool PseudoProbeForProfiling = false,
+ bool AtomicCounterUpdate = false);
PGOOptions(const PGOOptions &);
~PGOOptions();
PGOOptions &operator=(const PGOOptions &);
@@ -45,6 +46,7 @@ struct PGOOptions {
CSPGOAction CSAction;
bool DebugInfoForProfiling;
bool PseudoProbeForProfiling;
+ bool AtomicCounterUpdate;
IntrusiveRefCntPtr<vfs::FileSystem> FS;
};
} // namespace llvm
diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp
index 660cb2e974d781..aa42fb3771141a 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -724,7 +724,8 @@ void PassBuilder::addRequiredLTOPreLinkPasses(ModulePassManager &MPM) {
void PassBuilder::addPGOInstrPasses(ModulePassManager &MPM,
OptimizationLevel Level, bool RunProfileGen,
- bool IsCS, std::string ProfileFile,
+ bool IsCS, bool AtomicCounterUpdate,
+ std::string ProfileFile,
std::string ProfileRemappingFile,
ThinOrFullLTOPhase LTOPhase,
IntrusiveRefCntPtr<vfs::FileSystem> FS) {
@@ -793,13 +794,14 @@ void PassBuilder::addPGOInstrPasses(ModulePassManager &MPM,
// Do counter promotion at Level greater than O0.
Options.DoCounterPromotion = true;
Options.UseBFIInPromotion = IsCS;
+ Options.Atomic = AtomicCounterUpdate;
MPM.addPass(InstrProfiling(Options, IsCS));
}
void PassBuilder::addPGOInstrPassesForO0(
ModulePassManager &MPM, bool RunProfileGen, bool IsCS,
- std::string ProfileFile, std::string ProfileRemappingFile,
- IntrusiveRefCntPtr<vfs::FileSystem> FS) {
+ bool AtomicCounterUpdate, std::string ProfileFile,
+ std::string ProfileRemappingFile, IntrusiveRefCntPtr<vfs::FileSystem> FS) {
if (!RunProfileGen) {
assert(!ProfileFile.empty() && "Profile use expecting a profile file!");
MPM.addPass(
@@ -819,6 +821,7 @@ void PassBuilder::addPGOInstrPassesForO0(
// Do not do counter promotion at O0.
Options.DoCounterPromotion = false;
Options.UseBFIInPromotion = IsCS;
+ Options.Atomic = AtomicCounterUpdate;
MPM.addPass(InstrProfiling(Options, IsCS));
}
@@ -1093,9 +1096,10 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
(PGOOpt->Action == PGOOptions::IRInstr ||
PGOOpt->Action == PGOOptions::IRUse)) {
addPGOInstrPasses(MPM, Level,
- /* RunProfileGen */ PGOOpt->Action == PGOOptions::IRInstr,
- /* IsCS */ false, PGOOpt->ProfileFile,
- PGOOpt->ProfileRemappingFile, Phase, PGOOpt->FS);
+ /*RunProfileGen=*/PGOOpt->Action == PGOOptions::IRInstr,
+ /*IsCS=*/false, PGOOpt->AtomicCounterUpdate,
+ PGOOpt->ProfileFile, PGOOpt->ProfileRemappingFile, Phase,
+ PGOOpt->FS);
MPM.addPass(PGOIndirectCallPromotion(false, false));
}
if (PGOOpt && Phase != ThinOrFullLTOPhase::ThinLTOPostLink &&
@@ -1306,13 +1310,15 @@ PassBuilder::buildModuleOptimizationPipeline(OptimizationLevel Level,
// instrumentation is after all the inlines are done.
if (!LTOPreLink && PGOOpt) {
if (PGOOpt->CSAction == PGOOptions::CSIRInstr)
- addPGOInstrPasses(MPM, Level, /* RunProfileGen */ true,
- /* IsCS */ true, PGOOpt->CSProfileGenFile,
- PGOOpt->ProfileRemappingFile, LTOPhase, PGOOpt->FS);
+ addPGOInstrPasses(MPM, Level, /*RunProfileGen=*/true,
+ /*IsCS=*/true, PGOOpt->AtomicCounterUpdate,
+ PGOOpt->CSProfileGenFile, PGOOpt->ProfileRemappingFile,
+ LTOPhase, PGOOpt->FS);
else if (PGOOpt->CSAction == PGOOptions::CSIRUse)
- addPGOInstrPasses(MPM, Level, /* RunProfileGen */ false,
- /* IsCS */ true, PGOOpt->ProfileFile,
- PGOOpt->ProfileRemappingFile, LTOPhase, PGOOpt->FS);
+ addPGOInstrPasses(MPM, Level, /*RunProfileGen=*/false,
+ /*IsCS=*/true, PGOOpt->AtomicCounterUpdate,
+ PGOOpt->ProfileFile, PGOOpt->ProfileRemappingFile,
+ LTOPhase, PGOOpt->FS);
}
// Re-compute GlobalsAA here prior to function passes. This is particularly
@@ -1787,14 +1793,14 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
// sensitive PGO pass.
if (PGOOpt) {
if (PGOOpt->CSAction == PGOOptions::CSIRInstr)
- addPGOInstrPasses(MPM, Level, /* RunProfileGen */ true,
- /* IsCS */ true, PGOOpt->CSProfileGenFile,
- PGOOpt->ProfileRemappingFile,
+ addPGOInstrPasses(MPM, Level, /*RunProfileGen=*/true,
+ /*IsCS=*/true, PGOOpt->AtomicCounterUpdate,
+ PGOOpt->CSProfileGenFile, PGOOpt->ProfileRemappingFile,
ThinOrFullLTOPhase::FullLTOPostLink, PGOOpt->FS);
else if (PGOOpt->CSAction == PGOOptions::CSIRUse)
- addPGOInstrPasses(MPM, Level, /* RunProfileGen */ false,
- /* IsCS */ true, PGOOpt->ProfileFile,
- PGOOpt->ProfileRemappingFile,
+ addPGOInstrPasses(MPM, Level, /*RunProfileGen=*/false,
+ /*IsCS=*/true, PGOOpt->AtomicCounterUpdate,
+ PGOOpt->ProfileFile, PGOOpt->ProfileRemappingFile,
ThinOrFullLTOPhase::FullLTOPostLink, PGOOpt->FS);
}
@@ -1939,9 +1945,9 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
PGOOpt->Action == PGOOptions::IRUse))
addPGOInstrPassesForO0(
MPM,
- /* RunProfileGen */ (PGOOpt->Action == PGOOptions::IRInstr),
- /* IsCS */ false, PGOOpt->ProfileFile, PGOOpt->ProfileRemappingFile,
- PGOOpt->FS);
+ /*RunProfileGen=*/(PGOOpt->Action == PGOOptions::IRInstr),
+ /*IsCS=*/false, PGOOpt->AtomicCounterUpdate, PGOOpt->ProfileFile,
+ PGOOpt->ProfileRemappingFile, PGOOpt->FS);
invokePipelineStartEPCallbacks(MPM, Level);
diff --git a/llvm/lib/Support/PGOOptions.cpp b/llvm/lib/Support/PGOOptions.cpp
index 04d50cc70d91c2..7e57b52e4ba2f5 100644
--- a/llvm/lib/Support/PGOOptions.cpp
+++ b/llvm/lib/Support/PGOOptions.cpp
@@ -16,13 +16,14 @@ PGOOptions::PGOOptions(std::string ProfileFile, std::string CSProfileGenFile,
std::string MemoryProfile,
IntrusiveRefCntPtr<vfs::FileSystem> FS, PGOAction Action,
CSPGOAction CSAction, bool DebugInfoForProfiling,
- bool PseudoProbeForProfiling)
+ bool PseudoProbeForProfiling, bool AtomicCounterUpdate)
: ProfileFile(ProfileFile), CSProfileGenFile(CSProfileGenFile),
ProfileRemappingFile(ProfileRemappingFile), MemoryProfile(MemoryProfile),
Action(Action), CSAction(CSAction),
DebugInfoForProfiling(DebugInfoForProfiling ||
(Action == SampleUse && !PseudoProbeForProfiling)),
- PseudoProbeForProfiling(PseudoProbeForProfiling), FS(std::move(FS)) {
+ PseudoProbeForProfiling(PseudoProbeForProfiling),
+ AtomicCounterUpdate(AtomicCounterUpdate), FS(std::move(FS)) {
// Note, we do allow ProfileFile.empty() for Action=IRUse LTO can
// callback with IRUse action without ProfileFile.
More information about the cfe-commits
mailing list