Skip to content

@constprop :none not working? #59592

@timholy

Description

@timholy

One of the invalidations caused by StyledStrings can be seen here:

inserting kwcall(::NamedTuple, ::typeof(printstyled), io::Base.AnnotatedIOBuffer, msg...) @ StyledStrings.Legacy ~/.julia/juliaup/julia-1.12.0-rc2+0.x64.linux.gnu/share/julia/stdlib/v1.12/StyledStrings/src/legacy.jl:126 invalidated:
   backedges:  1: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{color::Symbol, underline::Bool}, ::typeof(printstyled), ::IO, ::String, ::String, ::Int32) (1 children)
               2: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{color::Symbol}, ::typeof(printstyled), ::IO, ::DataType) (1 children)
               3: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{color::Symbol}, ::typeof(printstyled), ::IO, ::String, ::Char) (1 children)
               4: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::NamedTuple{(:color, :bold), <:Tuple{Union{Int64, Symbol}, Bool}}, ::typeof(printstyled), ::IO, ::String) (1 children)
               5: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{bold::Bool, italic::Bool, underline::Bool, blink::Bool, reverse::Bool, hidden::Bool, color::Int64}, ::typeof(printstyled), ::IO, ::String) (2 children)
               6: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{color::Symbol, underline::Bool}, ::typeof(printstyled), ::IO, ::String, ::String, ::Int64) (2 children)
               7: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{color::Symbol}, ::typeof(printstyled), ::IO, ::Module) (2 children)
               8: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{color::Symbol}, ::typeof(printstyled), ::IO, ::Type) (2 children)
               9: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{color::Symbol}, ::typeof(printstyled), ::IO, ::String, ::Any, ::String, ::Any, ::String) (2 children)
              10: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{color::Symbol}, ::typeof(printstyled), ::IO, ::String, ::Any) (2 children)
              11: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::NamedTuple{(:bold, :color), <:Tuple{Bool, Union{Int64, Symbol}}}, ::typeof(printstyled), ::IO, ::String) (2 children)
              12: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{color::Symbol}, ::typeof(printstyled), ::IO, ::String, ::String) (3 children)
              13: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{color::Symbol, bold::Bool}, ::typeof(printstyled), ::IO, ::String) (3 children)
              14: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{color::Symbol, bold::Bool}, ::typeof(printstyled), ::IO, ::Any) (3 children)
              15: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{color::Symbol, bold::Bool}, ::typeof(printstyled), ::IO, ::String, ::DataType, ::String) (3 children)
              16: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{color::Symbol, bold::Bool}, ::typeof(printstyled), ::IO, ::Module, ::Char) (5 children)
              17: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{color::Symbol}, ::typeof(printstyled), ::IO, ::Any) (6 children)
              18: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{bold::Bool, italic::Bool, underline::Bool, blink::Bool, reverse::Bool, hidden::Bool, color::Symbol}, ::typeof(printstyled), ::IO, ::Any, ::String) (6 children)
              19: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{color::Symbol}, ::typeof(printstyled), ::IO, ::String, ::Any, ::String) (51 children)
              20: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{color::Symbol}, ::typeof(printstyled), ::IO, ::String) (148 children)
              21: superseding kwcall(::NamedTuple, ::typeof(printstyled), io::IO, msg...) @ Base util.jl:141 with MethodInstance for Core.kwcall(::@NamedTuple{bold::Bool, italic::Bool, underline::Bool, blink::Bool, reverse::Bool, hidden::Bool, color::Symbol}, ::typeof(printstyled), ::IO, ::String) (179 children)

If you follow the last of these, you're immediately led to:

julia> root
MethodInstance for Core.kwcall(::@NamedTuple{bold::Bool, italic::Bool, underline::Bool, blink::Bool, reverse::Bool, hidden::Bool, color::Symbol}, ::typeof(printstyled), ::IO, ::String) at depth 0 with 179 children

julia> ascend(root)
Choose a call for analysis (q to quit):
 >   kwcall(::@NamedTuple{bold::Bool, italic::Bool, underline::Bool, blink::Bool, reverse::Bool, hidden::Bool, color::Symbol}, ::typeof(printstyled), ::IO, ::String)
       #printstyled#847(::Bool, ::Bool, ::Bool, ::Bool, ::Bool, ::Bool, ::Symbol, ::typeof(printstyled), ::String)
            ...

The only non-inferrable type in the kwcall is IO. I'm quite puzzled about why this is vulnerable to invalidation, as subtypes(IO) has length 15 which is too much for world-splitting. The other possibility that comes to mind is constant propagation, but that printstyled method is

julia/base/util.jl

Lines 143 to 144 in f0ece4a

@constprop :none printstyled(msg...; bold::Bool=false, italic::Bool=false, underline::Bool=false, blink::Bool=false, reverse::Bool=false, hidden::Bool=false, color::Union{Int,Symbol}=:normal) =
printstyled(stdout, msg...; bold=bold, italic=italic, underline=underline, blink=blink, reverse=reverse, hidden=hidden, color=color)

and thus annotated with @constprop :none. The callee is thus annotated, too.

If that were working properly, then I don't currently see how an invalidation could be triggered. Thus I wonder if it isn't working as intended.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions