diff --git a/src/jitlayers.h b/src/jitlayers.h index 43fdc9b83b89b..56050a67439bc 100644 --- a/src/jitlayers.h +++ b/src/jitlayers.h @@ -87,6 +87,7 @@ struct OptimizationOptions { bool enable_scalar_optimizations; bool enable_loop_optimizations; bool enable_vector_pipeline; + bool enable_attributes; bool remove_ni; bool cleanup; bool warn_missed_transformations; @@ -102,6 +103,7 @@ struct OptimizationOptions { bool enable_scalar_optimizations=true, bool enable_loop_optimizations=true, bool enable_vector_pipeline=true, + bool enable_attributes=true, bool remove_ni=true, bool cleanup=true, bool warn_missed_transformations=false) { @@ -109,6 +111,7 @@ struct OptimizationOptions { always_inline, enable_early_simplifications, enable_early_optimizations, enable_scalar_optimizations, enable_loop_optimizations, enable_vector_pipeline, + enable_attributes, remove_ni, cleanup, warn_missed_transformations}; } }; diff --git a/src/pipeline.cpp b/src/pipeline.cpp index f91db6fc037d7..1c6cd2afdc1db 100644 --- a/src/pipeline.cpp +++ b/src/pipeline.cpp @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -381,9 +382,15 @@ static void buildEarlyOptimizerPipeline(ModulePassManager &MPM, PassBuilder *PB, if (options.enable_early_optimizations) { invokeOptimizerEarlyCallbacks(MPM, PB, O); { + if (O.getSpeedupLevel() >= 2) { + MPM.addPass(RequireAnalysisPass()); + MPM.addPass(createModuleToFunctionPassAdaptor(InvalidateAnalysisPass())); + } CGSCCPassManager CGPM; invokeCGSCCCallbacks(CGPM, PB, O); if (O.getSpeedupLevel() >= 2) { + if (options.enable_attributes) + CGPM.addPass(PostOrderFunctionAttrsPass()); FunctionPassManager FPM; JULIA_PASS(FPM.addPass(AllocOptPass())); FPM.addPass(Float2IntPass()); @@ -392,9 +399,6 @@ static void buildEarlyOptimizerPipeline(ModulePassManager &MPM, PassBuilder *PB, } MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(std::move(CGPM))); } - if (O.getSpeedupLevel() >= 2) { - MPM.addPass(RequireAnalysisPass()); - } // MPM.addPass(createModuleToFunctionPassAdaptor(InvalidateAnalysisPass())); if (options.dump_native) { MPM.addPass(StripDeadPrototypesPass()); @@ -630,13 +634,21 @@ static void buildPipeline(ModulePassManager &MPM, PassBuilder *PB, OptimizationL { FunctionPassManager FPM; buildLoopOptimizerPipeline(FPM, PB, O, options); - buildScalarOptimizerPipeline(FPM, PB, O, options); + MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM))); + if (options.enable_attributes) + MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(PostOrderFunctionAttrsPass())); + FunctionPassManager FPM2; + buildScalarOptimizerPipeline(FPM2, PB, O, options); + MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM2))); + if (options.enable_attributes) + MPM.addPass(ReversePostOrderFunctionAttrsPass()); + FunctionPassManager FPM3; if (O.getSpeedupLevel() >= 2) { - buildVectorPipeline(FPM, PB, O, options); + buildVectorPipeline(FPM3, PB, O, options); } if (options.warn_missed_transformations) - FPM.addPass(WarnMissedTransformationsPass()); - MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM))); + FPM3.addPass(WarnMissedTransformationsPass()); + MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM3))); } buildIntrinsicLoweringPipeline(MPM, PB, O, options); buildCleanupPipeline(MPM, PB, O, options); @@ -830,6 +842,7 @@ static std::optional> parseJul OPTION(enable_scalar_optimizations), OPTION(enable_loop_optimizations), OPTION(enable_vector_pipeline), + OPTION(enable_attributes), OPTION(remove_ni), OPTION(cleanup), OPTION(warn_missed_transformations)