forked from OSchip/llvm-project
[NFC] Do not run CGProfilePass when not using integrated assembler
Summary: CGProfilePass is run by default in certain new pass manager optimization pipeline. Assemblers other than llvm as (such as gnu as) cannot recognize the .cgprofile entries generated and emitted from this pass, causing build time error. This patch adds new options in clang CodeGenOpts and PassBuilder options so that we can turn cgprofile off when not using integrated assembler. Reviewers: Bigcheese, xur, george.burgess.iv, chandlerc, manojgupta Reviewed By: manojgupta Subscribers: manojgupta, void, hiraditya, dexonsmith, llvm-commits, tcwang, llozano Tags: #llvm, #clang Differential Revision: https://reviews.llvm.org/D62627
This commit is contained in:
parent
4799a1745b
commit
94d912296d
clang
llvm
|
@ -254,6 +254,7 @@ CODEGENOPT(UnwindTables , 1, 0) ///< Emit unwind tables.
|
|||
CODEGENOPT(VectorizeLoop , 1, 0) ///< Run loop vectorizer.
|
||||
CODEGENOPT(VectorizeSLP , 1, 0) ///< Run SLP vectorizer.
|
||||
CODEGENOPT(ProfileSampleAccurate, 1, 0) ///< Sample profile is accurate.
|
||||
CODEGENOPT(CallGraphProfile , 1, 0) ///< Run call graph profile.
|
||||
|
||||
/// Attempt to use register sized accesses to bit-fields in structures, when
|
||||
/// possible.
|
||||
|
|
|
@ -1108,6 +1108,7 @@ void EmitAssemblyHelper::EmitAssemblyWithNewPassManager(
|
|||
PTO.LoopInterleaving = CodeGenOpts.UnrollLoops;
|
||||
PTO.LoopVectorization = CodeGenOpts.VectorizeLoop;
|
||||
PTO.SLPVectorization = CodeGenOpts.VectorizeSLP;
|
||||
PTO.CallGraphProfile = CodeGenOpts.CallGraphProfile;
|
||||
PTO.Coroutines = LangOpts.Coroutines;
|
||||
|
||||
PassInstrumentationCallbacks PIC;
|
||||
|
@ -1518,6 +1519,7 @@ static void runThinLTOBackend(ModuleSummaryIndex *CombinedIndex, Module *M,
|
|||
Conf.PTO.LoopInterleaving = CGOpts.UnrollLoops;
|
||||
Conf.PTO.LoopVectorization = CGOpts.VectorizeLoop;
|
||||
Conf.PTO.SLPVectorization = CGOpts.VectorizeSLP;
|
||||
Conf.PTO.CallGraphProfile = CGOpts.CallGraphProfile;
|
||||
|
||||
// Context sensitive profile.
|
||||
if (CGOpts.hasProfileCSIRInstr()) {
|
||||
|
|
|
@ -823,6 +823,7 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
|||
Opts.RerollLoops = Args.hasArg(OPT_freroll_loops);
|
||||
|
||||
Opts.DisableIntegratedAS = Args.hasArg(OPT_fno_integrated_as);
|
||||
Opts.CallGraphProfile = !Opts.DisableIntegratedAS;
|
||||
Opts.Autolink = !Args.hasArg(OPT_fno_autolink);
|
||||
Opts.SampleProfileFile =
|
||||
std::string(Args.getLastArgValue(OPT_fprofile_sample_use_EQ));
|
||||
|
|
|
@ -105,6 +105,10 @@ public:
|
|||
/// Tuning option to disable promotion to scalars in LICM with MemorySSA, if
|
||||
/// the number of access is too large.
|
||||
unsigned LicmMssaNoAccForPromotionCap;
|
||||
|
||||
/// Tuning option to enable/disable call graph profile. Its default value is
|
||||
/// that of the flag: `-enable-npm-call-graph-profile`.
|
||||
bool CallGraphProfile;
|
||||
};
|
||||
|
||||
/// This class provides access to building LLVM's passes.
|
||||
|
|
|
@ -237,6 +237,10 @@ static cl::opt<bool>
|
|||
EnableCHR("enable-chr-npm", cl::init(true), cl::Hidden,
|
||||
cl::desc("Enable control height reduction optimization (CHR)"));
|
||||
|
||||
static cl::opt<bool> EnableCallGraphProfile(
|
||||
"enable-npm-call-graph-profile", cl::init(true), cl::Hidden,
|
||||
cl::desc("Enable call graph profile pass for the new PM (default = on)"));
|
||||
|
||||
PipelineTuningOptions::PipelineTuningOptions() {
|
||||
LoopInterleaving = EnableLoopInterleaving;
|
||||
LoopVectorization = EnableLoopVectorization;
|
||||
|
@ -246,6 +250,7 @@ PipelineTuningOptions::PipelineTuningOptions() {
|
|||
Coroutines = false;
|
||||
LicmMssaOptCap = SetLicmMssaOptCap;
|
||||
LicmMssaNoAccForPromotionCap = SetLicmMssaNoAccForPromotionCap;
|
||||
CallGraphProfile = EnableCallGraphProfile;
|
||||
}
|
||||
|
||||
extern cl::opt<bool> EnableHotColdSplit;
|
||||
|
@ -1060,7 +1065,8 @@ ModulePassManager PassBuilder::buildModuleOptimizationPipeline(
|
|||
// Add the core optimizing pipeline.
|
||||
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(OptimizePM)));
|
||||
|
||||
MPM.addPass(CGProfilePass());
|
||||
if (PTO.CallGraphProfile)
|
||||
MPM.addPass(CGProfilePass());
|
||||
|
||||
// Now we need to do some global optimization transforms.
|
||||
// FIXME: It would seem like these should come first in the optimization
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
; RUN: opt -debug-pass-manager -passes='default<O2>' %s 2>&1 |FileCheck %s --check-prefixes=DEFAULT
|
||||
; RUN: opt -debug-pass-manager -passes='default<O2>' -enable-npm-call-graph-profile=0 %s 2>&1 |FileCheck %s --check-prefixes=OFF
|
||||
; RUN: opt -debug-pass-manager -passes='default<O2>' -enable-npm-call-graph-profile=1 %s 2>&1 |FileCheck %s --check-prefixes=ON
|
||||
;
|
||||
; DEFAULT: Running pass: CGProfilePass
|
||||
; OFF-NOT: Running pass: CGProfilePass
|
||||
; ON: Running pass: CGProfilePass
|
||||
|
||||
define void @foo() {
|
||||
ret void
|
||||
}
|
Loading…
Reference in New Issue