Skip to content

Commit

Permalink
Make warn missed transformations pass optional (JuliaLang#54871)
Browse files Browse the repository at this point in the history
This makes the `WarnMissedTransformationsPass` compiler pass optional
and off by default.

This is a backport of 1fc9fe1.
  • Loading branch information
lcw committed Jul 24, 2024
1 parent 884c71e commit 6b48447
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 7 deletions.
2 changes: 1 addition & 1 deletion src/codegen-stubs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) { }

Expand Down
6 changes: 4 additions & 2 deletions src/jitlayers.h
Original file line number Diff line number Diff line change
Expand Up @@ -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};
}
};

Expand Down
12 changes: 8 additions & 4 deletions src/pipeline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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) {
Expand All @@ -604,7 +607,7 @@ extern "C" JL_DLLEXPORT_CODEGEN void jl_build_newpm_pipeline_impl(void *MPM, voi
}
}
buildPipeline(*reinterpret_cast<ModulePassManager*>(MPM), reinterpret_cast<PassBuilder*>(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
Expand Down Expand Up @@ -778,7 +781,8 @@ static llvm::Optional<std::pair<OptimizationLevel, OptimizationOptions>> parseJu
OPTION(lower_intrinsics),
OPTION(dump_native),
OPTION(external_use),
OPTION(llvm_only)
OPTION(llvm_only),
OPTION(warn_missed_transformations)
#undef OPTION
};
while (!name.empty()) {
Expand Down
20 changes: 20 additions & 0 deletions test/misc.jl
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 6b48447

Please sign in to comment.