diff --git a/base/compiler/ssair/inlining.jl b/base/compiler/ssair/inlining.jl index 1c9f4454abbfe7..83b69e4c82ff36 100644 --- a/base/compiler/ssair/inlining.jl +++ b/base/compiler/ssair/inlining.jl @@ -826,7 +826,7 @@ function compileable_specialization(mi::MethodInstance, effects::Effects, # If this caller does not want us to optimize calls to use their # declared compilesig, then it is also likely they would handle sparams # incorrectly if there were any unknown typevars, so we conservatively return nothing - if _any(t->isa(t, TypeVar), match.sparams) + if any(@nospecialize(t)->isa(t, TypeVar), mi.sparam_vals) return nothing end end diff --git a/test/compiler/inline.jl b/test/compiler/inline.jl index 62ff1a1ee7b6b8..55e8484471163a 100644 --- a/test/compiler/inline.jl +++ b/test/compiler/inline.jl @@ -4,7 +4,8 @@ using Test using Base.Meta using Core: ReturnNode -include(normpath(@__DIR__, "irutils.jl")) +include("irutils.jl") +include("newinterp.jl") """ Helper to walk the AST and call a function on every node. @@ -1990,3 +1991,25 @@ for run_finalizer_escape_test in (run_finalizer_escape_test1, run_finalizer_esca @test finalizer_escape == 3 end end + +# `compilesig_invokes` inlining option +@newinterp NoCompileSigInvokes +Core.Compiler.OptimizationParams(::NoCompileSigInvokes) = Core.Compiler.OptimizationParams(; compilesig_invokes=false) +@noinline no_compile_sig_invokes(@nospecialize x) = (x !== Any && !Base.has_free_typevars(x)) +let src = code_typed1((Type,); interp=NoCompileSigInvokes()) do x + no_compile_sig_invokes(x) + end + @test any(src.code) do @nospecialize x + isinvoke(:no_compile_sig_invokes, x) && + (x.args[1]::MethodInstance).specTypes == Tuple{typeof(no_compile_sig_invokes),Type} + end +end +let src = code_typed1((Union{DataType,UnionAll},); interp=NoCompileSigInvokes()) do x + no_compile_sig_invokes(x) + end + # test union split case + @test any(src.code) do @nospecialize x + isinvoke(:no_compile_sig_invokes, x) && + (x.args[1]::MethodInstance).specTypes == Tuple{typeof(no_compile_sig_invokes),UnionAll} + end +end