Skip to content

Wrap optimization options in a struct #45431

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

Closed
wants to merge 1 commit into from
Closed
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
27 changes: 13 additions & 14 deletions src/aotcompile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -515,7 +515,7 @@ void jl_dump_native_impl(void *native_code,
legacy::PassManager optimizer;
if (bc_fname || obj_fname || asm_fname) {
addTargetPasses(&optimizer, TM->getTargetTriple(), TM->getTargetIRAnalysis());
addOptimizationPasses(&optimizer, jl_options.opt_level, true, true);
addOptimizationPasses(&optimizer, jl_options.opt_level, {true, true, false});
addMachinePasses(&optimizer, jl_options.opt_level);
}

Expand Down Expand Up @@ -621,8 +621,7 @@ void addMachinePasses(legacy::PassManagerBase *PM, int optlevel)
// this defines the set of optimization passes defined for Julia at various optimization levels.
// it assumes that the TLI and TTI wrapper passes have already been added.
void addOptimizationPasses(legacy::PassManagerBase *PM, int opt_level,
bool lower_intrinsics, bool dump_native,
bool external_use)
OptimizationOptions options)
{
// Note: LLVM 12 disabled the hoisting of common instruction
// before loop vectorization (https://reviews.llvm.org/D84108).
Expand All @@ -639,7 +638,7 @@ void addOptimizationPasses(legacy::PassManagerBase *PM, int opt_level,

PM->add(createConstantMergePass());
if (opt_level < 2) {
if (!dump_native) {
if (!options.dump_native) {
// we won't be multiversioning, so lower CPU feature checks early on
// so that we can avoid an additional CFG simplification pass at the end.
PM->add(createCPUFeaturesPass());
Expand All @@ -657,21 +656,21 @@ void addOptimizationPasses(legacy::PassManagerBase *PM, int opt_level,
PM->add(createMemCpyOptPass());
PM->add(createAlwaysInlinerLegacyPass()); // Respect always_inline
PM->add(createLowerSimdLoopPass()); // Annotate loop marked with "loopinfo" as LLVM parallel loop
if (lower_intrinsics) {
if (options.lower_intrinsics) {
PM->add(createBarrierNoopPass());
PM->add(createLowerExcHandlersPass());
PM->add(createGCInvariantVerifierPass(false));
PM->add(createRemoveNIPass());
PM->add(createLateLowerGCFramePass());
PM->add(createFinalLowerGCPass());
PM->add(createLowerPTLSPass(dump_native));
PM->add(createLowerPTLSPass(options.dump_native));
}
else {
PM->add(createRemoveNIPass());
}
PM->add(createLowerSimdLoopPass()); // Annotate loop marked with "loopinfo" as LLVM parallel loop
if (dump_native) {
PM->add(createMultiVersioningPass(external_use));
if (options.dump_native) {
PM->add(createMultiVersioningPass(options.external_use));
PM->add(createCPUFeaturesPass());
// minimal clean-up to get rid of CPU feature checks
if (opt_level == 1) {
Expand Down Expand Up @@ -712,8 +711,8 @@ void addOptimizationPasses(legacy::PassManagerBase *PM, int opt_level,
// consider AggressiveInstCombinePass at optlevel > 2
PM->add(createInstructionCombiningPass());
PM->add(createCFGSimplificationPass(simplifyCFGOptions));
if (dump_native)
PM->add(createMultiVersioningPass(external_use));
if (options.dump_native)
PM->add(createMultiVersioningPass(options.external_use));
PM->add(createCPUFeaturesPass());
PM->add(createSROAPass());
PM->add(createInstSimplifyLegacyPass());
Expand Down Expand Up @@ -809,7 +808,7 @@ void addOptimizationPasses(legacy::PassManagerBase *PM, int opt_level,

PM->add(createAggressiveDCEPass());

if (lower_intrinsics) {
if (options.lower_intrinsics) {
// LowerPTLS removes an indirect call. As a result, it is likely to trigger
// LLVM's devirtualization heuristics, which would result in the entire
// pass pipeline being re-exectuted. Prevent this by inserting a barrier.
Expand All @@ -828,7 +827,7 @@ void addOptimizationPasses(legacy::PassManagerBase *PM, int opt_level,
PM->add(createSCCPPass());
// Remove dead use of ptls
PM->add(createDeadCodeEliminationPass());
PM->add(createLowerPTLSPass(dump_native));
PM->add(createLowerPTLSPass(options.dump_native));
PM->add(createInstructionCombiningPass());
// Clean up write barrier and ptls lowering
PM->add(createCFGSimplificationPass());
Expand Down Expand Up @@ -866,7 +865,7 @@ class JuliaPipeline : public Pass {
PMTopLevelManager *TPM = Stack.top()->getTopLevelManager();
TPMAdapter Adapter(TPM);
addTargetPasses(&Adapter, jl_ExecutionEngine->getTargetTriple(), jl_ExecutionEngine->getTargetIRAnalysis());
addOptimizationPasses(&Adapter, OptLevel, true, dump_native, true);
addOptimizationPasses(&Adapter, OptLevel, {true, dump_native, true});
addMachinePasses(&Adapter, OptLevel);
}
JuliaPipeline() : Pass(PT_PassManager, ID) {}
Expand All @@ -890,7 +889,7 @@ static RegisterPass<JuliaPipeline<3,true>> ZS("juliaO3-sysimg", "Runs the entire

extern "C" JL_DLLEXPORT
void jl_add_optimization_passes_impl(LLVMPassManagerRef PM, int opt_level, int lower_intrinsics) {
addOptimizationPasses(unwrap(PM), opt_level, lower_intrinsics);
addOptimizationPasses(unwrap(PM), opt_level, {!!lower_intrinsics, false, false});
}

// new pass manager plugin
Expand Down
12 changes: 11 additions & 1 deletion src/jitlayers.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,18 @@ extern "C" jl_cgparams_t jl_default_cgparams;
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(orc::ThreadSafeContext, LLVMOrcThreadSafeContextRef)
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(orc::ThreadSafeModule, LLVMOrcThreadSafeModuleRef)

struct OptimizationOptions {
bool lower_intrinsics;
bool dump_native;
bool external_use;

static OptimizationOptions defaults() {
return {true, false, false};
}
};

void addTargetPasses(legacy::PassManagerBase *PM, const Triple &triple, TargetIRAnalysis analysis);
void addOptimizationPasses(legacy::PassManagerBase *PM, int opt_level, bool lower_intrinsics=true, bool dump_native=false, bool external_use=false);
void addOptimizationPasses(legacy::PassManagerBase *PM, int opt_level, OptimizationOptions options = OptimizationOptions::defaults());
void addMachinePasses(legacy::PassManagerBase *PM, int optlevel);
void jl_finalize_module(orc::ThreadSafeModule m);
void jl_merge_module(orc::ThreadSafeModule &dest, orc::ThreadSafeModule src);
Expand Down