Skip to content

Revert "Add IR Profile-Guided Optimization (IR PGO) support to the Flang compiler" #142159

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 30, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 2 additions & 4 deletions clang/include/clang/Basic/CodeGenOptions.def
Original file line number Diff line number Diff line change
Expand Up @@ -223,11 +223,9 @@ AFFECTING_VALUE_CODEGENOPT(OptimizeSize, 2, 0) ///< If -Os (==1) or -Oz (==2) is
CODEGENOPT(AtomicProfileUpdate , 1, 0) ///< Set -fprofile-update=atomic
CODEGENOPT(ContinuousProfileSync, 1, 0) ///< Enable continuous instrumentation profiling
/// Choose profile instrumenation kind or no instrumentation.

ENUM_CODEGENOPT(ProfileInstr, llvm::driver::ProfileInstrKind, 4, llvm::driver::ProfileInstrKind::ProfileNone)

ENUM_CODEGENOPT(ProfileInstr, ProfileInstrKind, 4, ProfileNone)
/// Choose profile kind for PGO use compilation.
ENUM_CODEGENOPT(ProfileUse, llvm::driver::ProfileInstrKind, 2, llvm::driver::ProfileInstrKind::ProfileNone)
ENUM_CODEGENOPT(ProfileUse, ProfileInstrKind, 2, ProfileNone)
/// Partition functions into N groups and select only functions in group i to be
/// instrumented. Selected group numbers can be 0 to N-1 inclusive.
VALUE_CODEGENOPT(ProfileTotalFunctionGroups, 32, 1)
Expand Down
22 changes: 8 additions & 14 deletions clang/include/clang/Basic/CodeGenOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -518,41 +518,35 @@ class CodeGenOptions : public CodeGenOptionsBase {

/// Check if Clang profile instrumenation is on.
bool hasProfileClangInstr() const {
return getProfileInstr() ==
llvm::driver::ProfileInstrKind::ProfileClangInstr;
return getProfileInstr() == ProfileClangInstr;
}

/// Check if IR level profile instrumentation is on.
bool hasProfileIRInstr() const {
return getProfileInstr() == llvm::driver::ProfileInstrKind::ProfileIRInstr;
return getProfileInstr() == ProfileIRInstr;
}

/// Check if CS IR level profile instrumentation is on.
bool hasProfileCSIRInstr() const {
return getProfileInstr() ==
llvm::driver::ProfileInstrKind::ProfileCSIRInstr;
return getProfileInstr() == ProfileCSIRInstr;
}

/// Check if any form of instrumentation is on.
bool hasProfileInstr() const {
return getProfileInstr() != llvm::driver::ProfileInstrKind::ProfileNone;
}
bool hasProfileInstr() const { return getProfileInstr() != ProfileNone; }

/// Check if Clang profile use is on.
bool hasProfileClangUse() const {
return getProfileUse() == llvm::driver::ProfileInstrKind::ProfileClangInstr;
return getProfileUse() == ProfileClangInstr;
}

/// Check if IR level profile use is on.
bool hasProfileIRUse() const {
return getProfileUse() == llvm::driver::ProfileInstrKind::ProfileIRInstr ||
getProfileUse() == llvm::driver::ProfileInstrKind::ProfileCSIRInstr;
return getProfileUse() == ProfileIRInstr ||
getProfileUse() == ProfileCSIRInstr;
}

/// Check if CSIR profile use is on.
bool hasProfileCSIRUse() const {
return getProfileUse() == llvm::driver::ProfileInstrKind::ProfileCSIRInstr;
}
bool hasProfileCSIRUse() const { return getProfileUse() == ProfileCSIRInstr; }

/// Check if type and variable info should be emitted.
bool hasReducedDebugInfo() const {
Expand Down
9 changes: 5 additions & 4 deletions clang/include/clang/Basic/ProfileList.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,16 +49,17 @@ class ProfileList {
~ProfileList();

bool isEmpty() const { return Empty; }
ExclusionType getDefault(llvm::driver::ProfileInstrKind Kind) const;
ExclusionType getDefault(CodeGenOptions::ProfileInstrKind Kind) const;

std::optional<ExclusionType>
isFunctionExcluded(StringRef FunctionName,
llvm::driver::ProfileInstrKind Kind) const;
CodeGenOptions::ProfileInstrKind Kind) const;
std::optional<ExclusionType>
isLocationExcluded(SourceLocation Loc,
llvm::driver::ProfileInstrKind Kind) const;
CodeGenOptions::ProfileInstrKind Kind) const;
std::optional<ExclusionType>
isFileExcluded(StringRef FileName, llvm::driver::ProfileInstrKind Kind) const;
isFileExcluded(StringRef FileName,
CodeGenOptions::ProfileInstrKind Kind) const;
};

} // namespace clang
Expand Down
4 changes: 2 additions & 2 deletions clang/include/clang/Driver/Options.td
Original file line number Diff line number Diff line change
Expand Up @@ -1772,7 +1772,7 @@ def fmcdc_max_test_vectors_EQ : Joined<["-"], "fmcdc-max-test-vectors=">,
HelpText<"Maximum number of test vectors in MC/DC coverage">,
MarshallingInfoInt<CodeGenOpts<"MCDCMaxTVs">, "0x7FFFFFFE">;
def fprofile_generate : Flag<["-"], "fprofile-generate">,
Group<f_Group>, Visibility<[ClangOption, CLOption, FlangOption, FC1Option]>,
Group<f_Group>, Visibility<[ClangOption, CLOption]>,
HelpText<"Generate instrumented code to collect execution counts into default.profraw (overridden by LLVM_PROFILE_FILE env var)">;
def fprofile_generate_EQ : Joined<["-"], "fprofile-generate=">,
Group<f_Group>, Visibility<[ClangOption, CLOption]>,
Expand All @@ -1789,7 +1789,7 @@ def fprofile_use : Flag<["-"], "fprofile-use">, Group<f_Group>,
Visibility<[ClangOption, CLOption]>, Alias<fprofile_instr_use>;
def fprofile_use_EQ : Joined<["-"], "fprofile-use=">,
Group<f_Group>,
Visibility<[ClangOption, CLOption, FlangOption, FC1Option]>,
Visibility<[ClangOption, CLOption]>,
MetaVarName<"<pathname>">,
HelpText<"Use instrumentation data for profile-guided optimization. If pathname is a directory, it reads from <pathname>/default.profdata. Otherwise, it reads from file <pathname>.">;
def fno_profile_instr_generate : Flag<["-"], "fno-profile-instr-generate">,
Expand Down
20 changes: 10 additions & 10 deletions clang/lib/Basic/ProfileList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,24 +70,24 @@ ProfileList::ProfileList(ArrayRef<std::string> Paths, SourceManager &SM)

ProfileList::~ProfileList() = default;

static StringRef getSectionName(llvm::driver::ProfileInstrKind Kind) {
static StringRef getSectionName(CodeGenOptions::ProfileInstrKind Kind) {
switch (Kind) {
case llvm::driver::ProfileInstrKind::ProfileNone:
case CodeGenOptions::ProfileNone:
return "";
case llvm::driver::ProfileInstrKind::ProfileClangInstr:
case CodeGenOptions::ProfileClangInstr:
return "clang";
case llvm::driver::ProfileInstrKind::ProfileIRInstr:
case CodeGenOptions::ProfileIRInstr:
return "llvm";
case llvm::driver::ProfileInstrKind::ProfileCSIRInstr:
case CodeGenOptions::ProfileCSIRInstr:
return "csllvm";
case CodeGenOptions::ProfileIRSampleColdCov:
return "sample-coldcov";
}
llvm_unreachable("Unhandled llvm::driver::ProfileInstrKind enum");
llvm_unreachable("Unhandled CodeGenOptions::ProfileInstrKind enum");
}

ProfileList::ExclusionType
ProfileList::getDefault(llvm::driver::ProfileInstrKind Kind) const {
ProfileList::getDefault(CodeGenOptions::ProfileInstrKind Kind) const {
StringRef Section = getSectionName(Kind);
// Check for "default:<type>"
if (SCL->inSection(Section, "default", "allow"))
Expand Down Expand Up @@ -118,7 +118,7 @@ ProfileList::inSection(StringRef Section, StringRef Prefix,

std::optional<ProfileList::ExclusionType>
ProfileList::isFunctionExcluded(StringRef FunctionName,
llvm::driver::ProfileInstrKind Kind) const {
CodeGenOptions::ProfileInstrKind Kind) const {
StringRef Section = getSectionName(Kind);
// Check for "function:<regex>=<case>"
if (auto V = inSection(Section, "function", FunctionName))
Expand All @@ -132,13 +132,13 @@ ProfileList::isFunctionExcluded(StringRef FunctionName,

std::optional<ProfileList::ExclusionType>
ProfileList::isLocationExcluded(SourceLocation Loc,
llvm::driver::ProfileInstrKind Kind) const {
CodeGenOptions::ProfileInstrKind Kind) const {
return isFileExcluded(SM.getFilename(SM.getFileLoc(Loc)), Kind);
}

std::optional<ProfileList::ExclusionType>
ProfileList::isFileExcluded(StringRef FileName,
llvm::driver::ProfileInstrKind Kind) const {
CodeGenOptions::ProfileInstrKind Kind) const {
StringRef Section = getSectionName(Kind);
// Check for "source:<regex>=<case>"
if (auto V = inSection(Section, "source", FileName))
Expand Down
42 changes: 24 additions & 18 deletions clang/lib/CodeGen/BackendUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,17 @@ namespace clang {
extern llvm::cl::opt<bool> ClSanitizeGuardChecks;
}

// Default filename used for profile generation.
static std::string getDefaultProfileGenName() {
return DebugInfoCorrelate || ProfileCorrelate != InstrProfCorrelator::NONE
? "default_%m.proflite"
: "default_%m.profraw";
}

// Path and name of file used for profile generation
static std::string getProfileGenName(const CodeGenOptions &CodeGenOpts) {
std::string FileName = CodeGenOpts.InstrProfileOutput.empty()
? llvm::driver::getDefaultProfileGenName()
? getDefaultProfileGenName()
: CodeGenOpts.InstrProfileOutput;
if (CodeGenOpts.ContinuousProfileSync)
FileName = "%c" + FileName;
Expand Down Expand Up @@ -828,45 +835,44 @@ void EmitAssemblyHelper::RunOptimizationPipeline(

if (CodeGenOpts.hasProfileIRInstr())
// -fprofile-generate.
PGOOpt = PGOOptions(
getProfileGenName(CodeGenOpts), "", "",
CodeGenOpts.MemoryProfileUsePath, nullptr, PGOOptions::IRInstr,
PGOOptions::NoCSAction, llvm::ClPGOColdFuncAttr,
CodeGenOpts.DebugInfoForProfiling,
/*PseudoProbeForProfiling=*/false, CodeGenOpts.AtomicProfileUpdate);
PGOOpt = PGOOptions(getProfileGenName(CodeGenOpts), "", "",
CodeGenOpts.MemoryProfileUsePath, nullptr,
PGOOptions::IRInstr, PGOOptions::NoCSAction,
ClPGOColdFuncAttr, CodeGenOpts.DebugInfoForProfiling,
/*PseudoProbeForProfiling=*/false,
CodeGenOpts.AtomicProfileUpdate);
else if (CodeGenOpts.hasProfileIRUse()) {
// -fprofile-use.
auto CSAction = CodeGenOpts.hasProfileCSIRUse() ? PGOOptions::CSIRUse
: PGOOptions::NoCSAction;
PGOOpt = PGOOptions(CodeGenOpts.ProfileInstrumentUsePath, "",
CodeGenOpts.ProfileRemappingFile,
CodeGenOpts.MemoryProfileUsePath, VFS,
PGOOptions::IRUse, CSAction, llvm::ClPGOColdFuncAttr,
PGOOptions::IRUse, CSAction, ClPGOColdFuncAttr,
CodeGenOpts.DebugInfoForProfiling);
} else if (!CodeGenOpts.SampleProfileFile.empty())
// -fprofile-sample-use
PGOOpt = PGOOptions(
CodeGenOpts.SampleProfileFile, "", CodeGenOpts.ProfileRemappingFile,
CodeGenOpts.MemoryProfileUsePath, VFS, PGOOptions::SampleUse,
PGOOptions::NoCSAction, llvm::ClPGOColdFuncAttr,
PGOOptions::NoCSAction, ClPGOColdFuncAttr,
CodeGenOpts.DebugInfoForProfiling, CodeGenOpts.PseudoProbeForProfiling);
else if (!CodeGenOpts.MemoryProfileUsePath.empty())
// -fmemory-profile-use (without any of the above options)
PGOOpt =
PGOOptions("", "", "", CodeGenOpts.MemoryProfileUsePath, VFS,
PGOOptions::NoAction, PGOOptions::NoCSAction,
llvm::ClPGOColdFuncAttr, CodeGenOpts.DebugInfoForProfiling);
PGOOpt = PGOOptions("", "", "", CodeGenOpts.MemoryProfileUsePath, VFS,
PGOOptions::NoAction, PGOOptions::NoCSAction,
ClPGOColdFuncAttr, CodeGenOpts.DebugInfoForProfiling);
else if (CodeGenOpts.PseudoProbeForProfiling)
// -fpseudo-probe-for-profiling
PGOOpt = PGOOptions("", "", "", /*MemoryProfile=*/"", nullptr,
PGOOptions::NoAction, PGOOptions::NoCSAction,
llvm::ClPGOColdFuncAttr,
CodeGenOpts.DebugInfoForProfiling, true);
PGOOpt =
PGOOptions("", "", "", /*MemoryProfile=*/"", nullptr,
PGOOptions::NoAction, PGOOptions::NoCSAction,
ClPGOColdFuncAttr, CodeGenOpts.DebugInfoForProfiling, true);
else if (CodeGenOpts.DebugInfoForProfiling)
// -fdebug-info-for-profiling
PGOOpt = PGOOptions("", "", "", /*MemoryProfile=*/"", nullptr,
PGOOptions::NoAction, PGOOptions::NoCSAction,
llvm::ClPGOColdFuncAttr, true);
ClPGOColdFuncAttr, true);

// Check to see if we want to generate a CS profile.
if (CodeGenOpts.hasProfileCSIRInstr()) {
Expand Down
4 changes: 2 additions & 2 deletions clang/lib/CodeGen/CodeGenAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -273,8 +273,8 @@ void BackendConsumer::HandleTranslationUnit(ASTContext &C) {
std::unique_ptr<llvm::ToolOutputFile> OptRecordFile =
std::move(*OptRecordFileOrErr);

if (OptRecordFile && CodeGenOpts.getProfileUse() !=
llvm::driver::ProfileInstrKind::ProfileNone)
if (OptRecordFile &&
CodeGenOpts.getProfileUse() != CodeGenOptions::ProfileNone)
Ctx.setDiagnosticsHotnessRequested(true);

if (CodeGenOpts.MisExpect) {
Expand Down
3 changes: 1 addition & 2 deletions clang/lib/CodeGen/CodeGenFunction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -940,8 +940,7 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, QualType RetTy,
}
}

if (CGM.getCodeGenOpts().getProfileInstr() !=
llvm::driver::ProfileInstrKind::ProfileNone) {
if (CGM.getCodeGenOpts().getProfileInstr() != CodeGenOptions::ProfileNone) {
switch (CGM.isFunctionBlockedFromProfileInstr(Fn, Loc)) {
case ProfileList::Skip:
Fn->addFnAttr(llvm::Attribute::SkipProfile);
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/CodeGen/CodeGenModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3601,7 +3601,7 @@ CodeGenModule::isFunctionBlockedByProfileList(llvm::Function *Fn,
// If the profile list is empty, then instrument everything.
if (ProfileList.isEmpty())
return ProfileList::Allow;
llvm::driver::ProfileInstrKind Kind = getCodeGenOpts().getProfileInstr();
CodeGenOptions::ProfileInstrKind Kind = getCodeGenOpts().getProfileInstr();
// First, check the function name.
if (auto V = ProfileList.isFunctionExcluded(Fn->getName(), Kind))
return *V;
Expand Down
4 changes: 0 additions & 4 deletions clang/lib/Driver/ToolChains/Flang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -883,10 +883,6 @@ void Flang::ConstructJob(Compilation &C, const JobAction &JA,
// TODO: Handle interactions between -w, -pedantic, -Wall, -WOption
Args.AddLastArg(CmdArgs, options::OPT_w);

// recognise options: fprofile-generate -fprofile-use=
Args.addAllArgs(
CmdArgs, {options::OPT_fprofile_generate, options::OPT_fprofile_use_EQ});

// Forward flags for OpenMP. We don't do this if the current action is an
// device offloading action other than OpenMP.
if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
Expand Down
6 changes: 3 additions & 3 deletions clang/lib/Frontend/CompilerInvocation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1499,11 +1499,11 @@ static void setPGOUseInstrumentor(CodeGenOptions &Opts,
// which is available (might be one or both).
if (PGOReader->isIRLevelProfile() || PGOReader->hasMemoryProfile()) {
if (PGOReader->hasCSIRLevelProfile())
Opts.setProfileUse(llvm::driver::ProfileInstrKind::ProfileCSIRInstr);
Opts.setProfileUse(CodeGenOptions::ProfileCSIRInstr);
else
Opts.setProfileUse(llvm::driver::ProfileInstrKind::ProfileIRInstr);
Opts.setProfileUse(CodeGenOptions::ProfileIRInstr);
} else
Opts.setProfileUse(llvm::driver::ProfileInstrKind::ProfileClangInstr);
Opts.setProfileUse(CodeGenOptions::ProfileClangInstr);
}

void CompilerInvocation::setDefaultPointerAuthOptions(
Expand Down
7 changes: 0 additions & 7 deletions flang/include/flang/Frontend/CodeGenOptions.def
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,8 @@ CODEGENOPT(OptimizationLevel, 2, 0) ///< The -O[0-3] option specified.
CODEGENOPT(DebugPassManager, 1, 0) ///< Prints debug information for the new
///< pass manager.


/// Choose profile instrumenation kind or no instrumentation.
ENUM_CODEGENOPT(ProfileInstr, llvm::driver::ProfileInstrKind, 2, llvm::driver::ProfileInstrKind::ProfileNone)
/// Choose profile kind for PGO use compilation.
ENUM_CODEGENOPT(ProfileUse, llvm::driver::ProfileInstrKind, 2, llvm::driver::ProfileInstrKind::ProfileNone)

CODEGENOPT(InstrumentFunctions, 1, 0) ///< Set when -finstrument_functions is
///< enabled on the compile step.

CODEGENOPT(IsPIE, 1, 0) ///< PIE level is the same as PIC Level.
CODEGENOPT(PICLevel, 2, 0) ///< PIC level of the LLVM module.
CODEGENOPT(PrepareForFullLTO , 1, 0) ///< Set when -flto is enabled on the
Expand Down
38 changes: 0 additions & 38 deletions flang/include/flang/Frontend/CodeGenOptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,44 +151,6 @@ class CodeGenOptions : public CodeGenOptionsBase {
/// OpenMP is enabled.
using DoConcurrentMappingKind = flangomp::DoConcurrentMappingKind;

/// Name of the profile file to use as output for -fprofile-instr-generate,
/// -fprofile-generate, and -fcs-profile-generate.
std::string InstrProfileOutput;

/// Name of the profile file to use as input for -fmemory-profile-use.
std::string MemoryProfileUsePath;

/// Name of the profile file to use as input for -fprofile-instr-use
std::string ProfileInstrumentUsePath;

/// Name of the profile remapping file to apply to the profile data supplied
/// by -fprofile-sample-use or -fprofile-instr-use.
std::string ProfileRemappingFile;

/// Check if Clang profile instrumenation is on.
bool hasProfileClangInstr() const {
return getProfileInstr() == llvm::driver::ProfileClangInstr;
}

/// Check if IR level profile instrumentation is on.
bool hasProfileIRInstr() const {
return getProfileInstr() == llvm::driver::ProfileIRInstr;
}

/// Check if CS IR level profile instrumentation is on.
bool hasProfileCSIRInstr() const {
return getProfileInstr() == llvm::driver::ProfileCSIRInstr;
}
/// Check if IR level profile use is on.
bool hasProfileIRUse() const {
return getProfileUse() == llvm::driver::ProfileIRInstr ||
getProfileUse() == llvm::driver::ProfileCSIRInstr;
}
/// Check if CSIR profile use is on.
bool hasProfileCSIRUse() const {
return getProfileUse() == llvm::driver::ProfileCSIRInstr;
}

// Define accessors/mutators for code generation options of enumeration type.
#define CODEGENOPT(Name, Bits, Default)
#define ENUM_CODEGENOPT(Name, Type, Bits, Default) \
Expand Down
10 changes: 0 additions & 10 deletions flang/lib/Frontend/CompilerInvocation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Frontend/Debug/Options.h"
#include "llvm/Frontend/Driver/CodeGenOptions.h"
#include "llvm/Option/Arg.h"
#include "llvm/Option/ArgList.h"
#include "llvm/Option/OptTable.h"
Expand Down Expand Up @@ -453,15 +452,6 @@ static void parseCodeGenArgs(Fortran::frontend::CodeGenOptions &opts,
opts.IsPIE = 1;
}

if (args.hasArg(clang::driver::options::OPT_fprofile_generate)) {
opts.setProfileInstr(llvm::driver::ProfileInstrKind::ProfileIRInstr);
}

if (auto A = args.getLastArg(clang::driver::options::OPT_fprofile_use_EQ)) {
opts.setProfileUse(llvm::driver::ProfileInstrKind::ProfileIRInstr);
opts.ProfileInstrumentUsePath = A->getValue();
}

// -mcmodel option.
if (const llvm::opt::Arg *a =
args.getLastArg(clang::driver::options::OPT_mcmodel_EQ)) {
Expand Down
Loading
Loading