Skip to content

Commit

Permalink
test metadata propagation to keyword sorter
Browse files Browse the repository at this point in the history
  • Loading branch information
aviatesk committed Jul 12, 2022
1 parent 12d48b2 commit 48707d3
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 3 deletions.
5 changes: 2 additions & 3 deletions base/compiler/abstractinterpretation.jl
Original file line number Diff line number Diff line change
Expand Up @@ -799,8 +799,7 @@ function const_prop_enabled(interp::AbstractInterpreter, sv::InferenceState, mat
add_remark!(interp, sv, "[constprop] Disabled by parameter")
return false
end
method = match.method
if method.constprop == 0x02
if is_no_constprop(match.method)
add_remark!(interp, sv, "[constprop] Disabled by method parameter")
return false
end
Expand Down Expand Up @@ -1003,7 +1002,7 @@ function is_all_overridden((; fargs, argtypes)::ArgInfo, sv::InferenceState)
end

function force_const_prop(interp::AbstractInterpreter, @nospecialize(f), method::Method)
return method.constprop == 0x01 ||
return is_aggressive_constprop(method) ||
InferenceParams(interp).aggressive_constant_propagation ||
istopfunction(f, :getproperty) ||
istopfunction(f, :setproperty!)
Expand Down
14 changes: 14 additions & 0 deletions base/compiler/utilities.jl
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,20 @@ function specialize_method(match::MethodMatch; kwargs...)
return specialize_method(match.method, match.spec_types, match.sparams; kwargs...)
end

"""
is_aggressive_constprop(method::Union{Method,CodeInfo}) -> Bool
Check if `method` is declared as `Base.@constprop :aggressive`.
"""
is_aggressive_constprop(method::Union{Method,CodeInfo}) = method.constprop == 0x01

"""
is_no_constprop(method::Union{Method,CodeInfo}) -> Bool
Check if `method` is declared as `Base.@constprop :none`.
"""
is_no_constprop(method::Union{Method,CodeInfo}) = method.constprop == 0x02

#########
# types #
#########
Expand Down
46 changes: 46 additions & 0 deletions test/compiler/inline.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1402,3 +1402,49 @@ end
end
end
end

# https://github.com/JuliaLang/julia/issues/45050
@testset "propagate :meta annotations to keyword sorter methods" begin
# @inline, @noinline, @constprop
let @inline f(::Any; x::Int=1) = 2x
@test ccall(:jl_ir_flag_inlineable, Bool, (Any,), only(methods(f)).source)
@test ccall(:jl_ir_flag_inlineable, Bool, (Any,), only(methods(Core.kwfunc(f))).source)
end
let @noinline f(::Any; x::Int=1) = 2x
@test !ccall(:jl_ir_flag_inlineable, Bool, (Any,), only(methods(f)).source)
@test !ccall(:jl_ir_flag_inlineable, Bool, (Any,), only(methods(Core.kwfunc(f))).source)
end
let Base.@constprop :aggressive f(::Any; x::Int=1) = 2x
@test Core.Compiler.is_aggressive_constprop(only(methods(f)))
@test Core.Compiler.is_aggressive_constprop(only(methods(Core.kwfunc(f))))
end
let Base.@constprop :none f(::Any; x::Int=1) = 2x
@test Core.Compiler.is_no_constprop(only(methods(f)))
@test Core.Compiler.is_no_constprop(only(methods(Core.kwfunc(f))))
end
# @nospecialize
let f(@nospecialize(A::Any); x::Int=1) = 2x
@test only(methods(f)).nospecialize == 1
@test only(methods(Core.kwfunc(f))).nospecialize == 4
end
let f(::Any; x::Int=1) = (@nospecialize; 2x)
@test only(methods(f)).nospecialize == -1
@test only(methods(Core.kwfunc(f))).nospecialize == -1
end
# Base.@assume_effects
let Base.@assume_effects :notaskstate f(::Any; x::Int=1) = 2x
@test Core.Compiler.decode_effects_override(only(methods(f)).purity).notaskstate
@test Core.Compiler.decode_effects_override(only(methods(Core.kwfunc(f))).purity).notaskstate
end
# propagate multiple metadata also
let @inline Base.@assume_effects :notaskstate Base.@constprop :aggressive f(::Any; x::Int=1) = (@nospecialize; 2x)
@test ccall(:jl_ir_flag_inlineable, Bool, (Any,), only(methods(f)).source)
@test Core.Compiler.is_aggressive_constprop(only(methods(f)))
@test ccall(:jl_ir_flag_inlineable, Bool, (Any,), only(methods(Core.kwfunc(f))).source)
@test Core.Compiler.is_aggressive_constprop(only(methods(Core.kwfunc(f))))
@test only(methods(f)).nospecialize == -1
@test only(methods(Core.kwfunc(f))).nospecialize == -1
@test Core.Compiler.decode_effects_override(only(methods(f)).purity).notaskstate
@test Core.Compiler.decode_effects_override(only(methods(Core.kwfunc(f))).purity).notaskstate
end
end

0 comments on commit 48707d3

Please sign in to comment.