Skip to content

Commit

Permalink
Merge e4fe26d into 5ffa603
Browse files Browse the repository at this point in the history
  • Loading branch information
JeffBezanson authored Jul 5, 2022
2 parents 5ffa603 + e4fe26d commit 2d16942
Show file tree
Hide file tree
Showing 5 changed files with 84 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
16 changes: 16 additions & 0 deletions src/ast.scm
Original file line number Diff line number Diff line change
Expand Up @@ -523,6 +523,22 @@
(and (if one (length= e 3) (length> e 2))
(eq? (car e) 'meta) (memq (cadr e) '(nospecialize specialize))))

(define (nospecialize-meta-noarg? e)
(and (length= e 2)
(eq? (car e) 'meta) (memq (cadr e) '(nospecialize specialize))))

(define (inline-meta? e)
(and (length> e 1)
(eq? (car e) 'meta) (any (lambda (x) (memq x '(inline noinline))) (cdr e))))

(define (propagate_inbounds-meta? e)
(and (length> e 1)
(eq? (car e) 'meta) (any (lambda (x) (equal? x '(propagate_inbounds))) (cdr e))))

(define (constprop-meta? e)
(and (length> e 1)
(eq? (car e) 'meta) (any (lambda (x) (memq x '(aggressive_constprop no_constprop))) (cdr e))))

(define (if-generated? e)
(and (length= e 4) (eq? (car e) 'if) (equal? (cadr e) '(generated))))

Expand Down
4 changes: 4 additions & 0 deletions src/julia-syntax.scm
Original file line number Diff line number Diff line change
Expand Up @@ -562,6 +562,10 @@
,(if (any kwarg? pargl) (gensy) UNUSED)
(call (core kwftype) ,ftype)) ,kw ,@pargl ,@vararg)
`(block
,@(filter nospecialize-meta-noarg? prologue)
,@(filter inline-meta? prologue)
,@(filter propagate_inbounds-meta? prologue)
,@(filter constprop-meta? prologue)
,@(let ((lnns (filter linenum? prologue)))
(if (pair? lnns)
(list (car lnns))
Expand Down
48 changes: 48 additions & 0 deletions test/compiler/inline.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1402,3 +1402,51 @@ 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

# propagate multiple metadata also
let @inline 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
end
let @noinline 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
end
end

0 comments on commit 2d16942

Please sign in to comment.