From 337c6781800456c4852817e9702264567af08d71 Mon Sep 17 00:00:00 2001 From: Lucas C Wilcox Date: Wed, 24 Jul 2024 13:12:53 -0700 Subject: [PATCH] Make warn missed transformations pass optional (#54871) This makes the `WarnMissedTransformationsPass` compiler pass optional and off by default. This is a backport of 1fc9fe1219d602bba82e14dc2ad999d072de236f. --- src/codegen-stubs.c | 2 +- src/jitlayers.h | 6 ++++-- src/pipeline.cpp | 10 +++++++--- test/misc.jl | 20 ++++++++++++++++++++ 4 files changed, 32 insertions(+), 6 deletions(-) diff --git a/src/codegen-stubs.c b/src/codegen-stubs.c index b48ad7b98791fc..849dce666b1e21 100644 --- a/src/codegen-stubs.c +++ b/src/codegen-stubs.c @@ -110,7 +110,7 @@ JL_DLLEXPORT uint64_t jl_getUnwindInfo_fallback(uint64_t dwAddr) JL_DLLEXPORT void jl_add_optimization_passes_fallback(void *PM, int opt_level, int lower_intrinsics) UNAVAILABLE JL_DLLEXPORT void jl_build_newpm_pipeline_fallback(void *MPM, void *PB, int Speedup, int Size, - int lower_intrinsics, int dump_native, int external_use, int llvm_only) UNAVAILABLE + int lower_intrinsics, int dump_native, int external_use, int llvm_only, int warn_missed_transformations) UNAVAILABLE JL_DLLEXPORT void jl_register_passbuilder_callbacks_fallback(void *PB) { } diff --git a/src/jitlayers.h b/src/jitlayers.h index f57861fa567946..e6dae7a3b7ded5 100644 --- a/src/jitlayers.h +++ b/src/jitlayers.h @@ -90,13 +90,15 @@ struct OptimizationOptions { bool dump_native; bool external_use; bool llvm_only; + bool warn_missed_transformations; static constexpr OptimizationOptions defaults( bool lower_intrinsics=true, bool dump_native=false, bool external_use=false, - bool llvm_only=false) { - return {lower_intrinsics, dump_native, external_use, llvm_only}; + bool llvm_only=false, + bool warn_missed_transformations=false) { + return {lower_intrinsics, dump_native, external_use, llvm_only, warn_missed_transformations}; } }; diff --git a/src/pipeline.cpp b/src/pipeline.cpp index 88c2da5d729c90..f4d394ca06df13 100644 --- a/src/pipeline.cpp +++ b/src/pipeline.cpp @@ -568,7 +568,9 @@ static void buildPipeline(ModulePassManager &MPM, PassBuilder *PB, OptimizationL if (O.getSpeedupLevel() >= 2) { buildVectorPipeline(FPM, PB, O, options); } - FPM.addPass(WarnMissedTransformationsPass()); + if (options.warn_missed_transformations) { + FPM.addPass(WarnMissedTransformationsPass()); + } MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM))); } buildIntrinsicLoweringPipeline(MPM, PB, O, options); @@ -577,7 +579,8 @@ static void buildPipeline(ModulePassManager &MPM, PassBuilder *PB, OptimizationL } extern "C" JL_DLLEXPORT_CODEGEN void jl_build_newpm_pipeline_impl(void *MPM, void *PB, int Speedup, int Size, - int lower_intrinsics, int dump_native, int external_use, int llvm_only) JL_NOTSAFEPOINT + int lower_intrinsics, int dump_native, int external_use, int llvm_only, + int warn_missed_transformations) JL_NOTSAFEPOINT { OptimizationLevel O; switch (Size) { @@ -604,7 +607,7 @@ extern "C" JL_DLLEXPORT_CODEGEN void jl_build_newpm_pipeline_impl(void *MPM, voi } } buildPipeline(*reinterpret_cast(MPM), reinterpret_cast(PB), O, - OptimizationOptions{!!lower_intrinsics, !!dump_native, !!external_use, !!llvm_only}); + OptimizationOptions{!!lower_intrinsics, !!dump_native, !!external_use, !!llvm_only, !!warn_missed_transformations}); } #undef JULIA_PASS @@ -779,6 +782,7 @@ static llvm::Optional> parseJu OPTION(dump_native), OPTION(external_use), OPTION(llvm_only) + OPTION(warn_missed_transformations) #undef OPTION }; while (!name.empty()) { diff --git a/test/misc.jl b/test/misc.jl index 79b684badf1e0e..64be037c5d9822 100644 --- a/test/misc.jl +++ b/test/misc.jl @@ -1402,3 +1402,23 @@ end GC.gc(true); yield() @test in_fin[] end + +@testset "Silenced missed transformations" begin + # Ensure the WarnMissedTransformationsPass is not on by default + src = """ + @noinline iteration(i) = (@show(i); return nothing) + @eval function loop_unroll_full_fail(N) + for i in 1:N + iteration(i) + \$(Expr(:loopinfo, (Symbol("llvm.loop.unroll.full"), 1))) + end + end + loop_unroll_full_fail(3) + """ + out_err = mktemp() do _, f + run(`$(Base.julia_cmd()) -e "$src"`, devnull, devnull, f) + seekstart(f) + read(f, String) + end + @test !occursin("loop not unrolled", out_err) +end