-
-
Notifications
You must be signed in to change notification settings - Fork 5.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
type assert Core.SimpleVector
in typejoin_union_tuple
#57631
base: master
Are you sure you want to change the base?
type assert Core.SimpleVector
in typejoin_union_tuple
#57631
Conversation
Should get rid of some invalidation on running user code.
To clarify, the type instability that causes the invalidations is caused by the fact that, when |
Decreases the invalidation count from loading the package ./julia -E 'using SnoopCompileCore; i=(@snoop_invalidations using TypeDomainNaturalNumbers); using SnoopCompile; length(uinvalidated(i))' |
Sorry for bothering you aviatesk, but can you please review, the change is just adding a (concrete) type assert to improve type stability. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not sure why this type annotation reduces the number of invalidations. T::DataType
should be enough to allow the compiler to infer this information.
You're right, it's an inference regression, created issue #57667. |
I think this should be merged as a quick fix given that inference issue doesn't seem trivial to fix. |
I might suggest a (broken) test case and a TODO comment alongside the fix if so |
Not sure if there's a good way to test for something here. Ref #55625 (comment) Good idea regarding adding a broken test, I'll make that PR for #57667 EDIT: actually, no, that doesn't seem like a completely robust test either. |
To be clear, it's not apparent to me the inference issue (#57667) is something that will ever be fixed, it's a bit speculative. So merging this PR right now seems like the obvious choice. The pattern of |
Gotcha makes sense |
the tree of invalidations fixed by this PR{
"method_instance": {
"method": "typejoin_union_tuple(T::DataType) @ Base promotion.jl:200",
"method_instance": "MethodInstance for Base.typejoin_union_tuple(::Type{Tuple{UnitRange{Int64}, Symbol, Any}})"
},
"children": [
{
"method_instance": {
"method": "promote_typejoin_union(::Type{T}) where T @ Base promotion.jl:185",
"method_instance": "MethodInstance for Base.promote_typejoin_union(::Type{Tuple{UnitRange{Int64}, Symbol, Any}})"
},
"children": [
{
"method_instance": {
"method": "_collect(c, itr, ::Base.EltypeUnknown, isz::Union{Base.HasLength, Base.HasShape}) @ Base array.jl:807",
"method_instance": "MethodInstance for Base._collect(::Vector{@NamedTuple{region::UnitRange{Int64}, label::Symbol, value}}, ::Base.Generator{Vector{@NamedTuple{region::UnitRange{Int64}, label::Symbol, value}}, typeof(values)}, ::Base.EltypeUnknown, ::Base.HasShape{1})"
},
"children": [
{
"method_instance": {
"method": "collect_similar(cont, itr) @ Base array.jl:732",
"method_instance": "MethodInstance for Base.collect_similar(::Vector{@NamedTuple{region::UnitRange{Int64}, label::Symbol, value}}, ::Base.Generator{Vector{@NamedTuple{region::UnitRange{Int64}, label::Symbol, value}}, typeof(values)})"
},
"children": [
{
"method_instance": {
"method": "map(f, A::AbstractArray) @ Base abstractarray.jl:3361",
"method_instance": "MethodInstance for map(::typeof(values), ::Vector{@NamedTuple{region::UnitRange{Int64}, label::Symbol, value}})"
},
"children": [
{
"method_instance": {
"method": "show(io::IO, s::A) where A<:AnnotatedString @ Base strings/annotated.jl:173",
"method_instance": "MethodInstance for show(::IOBuffer, ::A) where A<:Base.AnnotatedString"
},
"children": [
]
},
{
"method_instance": {
"method": "show(io::IO, s::A) where A<:AnnotatedString @ Base strings/annotated.jl:173",
"method_instance": "MethodInstance for show(::IOBuffer, ::A) where A<:Base.AnnotatedString"
},
"children": [
{
"method_instance": {
"method": "var\"#sprint#443\"(context, sizehint::Integer, ::typeof(sprint), f::Function, args...) @ Base strings/io.jl:110",
"method_instance": "MethodInstance for Base.var\"#sprint#443\"(::Nothing, ::Int64, ::typeof(sprint), ::typeof(show), ::AbstractString)"
},
"children": [
{
"method_instance": {
"method": "kwcall(::NamedTuple, ::typeof(sprint), f::Function, args...) @ Base strings/io.jl:110",
"method_instance": "MethodInstance for Core.kwcall(::@NamedTuple{context::Nothing}, ::typeof(sprint), ::typeof(show), ::AbstractString)"
},
"children": [
{
"method_instance": {
"method": "var\"#repr#446\"(context, ::typeof(repr), x) @ Base strings/io.jl:286",
"method_instance": "MethodInstance for Base.var\"#repr#446\"(::Nothing, ::typeof(repr), ::AbstractString)"
},
"children": [
{
"method_instance": {
"method": "repr(x; context) @ Base strings/io.jl:286",
"method_instance": "MethodInstance for repr(::AbstractString)"
},
"children": [
{
"method_instance": {
"method": "(::Base.JuliaSyntax.var\"#Kind##0#Kind##1\")() @ Base.JuliaSyntax ~/tmp/jl/julia-git/invalidations_build/base/JuliaSyntax/src/kinds.jl:47",
"method_instance": "MethodInstance for (::Base.JuliaSyntax.var\"#Kind##0#Kind##1\"{<:AbstractString})()"
},
"children": [
{
"method_instance": {
"method": "get(default::Union{Function, Type}, h::Dict{K, V}, key) where {K, V} @ Base dict.jl:524",
"method_instance": "MethodInstance for get(::Base.JuliaSyntax.var\"#Kind##0#Kind##1\"{<:AbstractString}, ::Dict{String, UInt16}, ::AbstractString)"
},
"children": [
{
"method_instance": {
"method": "Base.JuliaSyntax.Kind(s::AbstractString) @ Base.JuliaSyntax ~/tmp/jl/julia-git/invalidations_build/base/JuliaSyntax/src/kinds.jl:45",
"method_instance": "MethodInstance for Base.JuliaSyntax.Kind(::AbstractString)"
},
"children": [
{
"method_instance": {
"method": "(::Base.JuliaSyntax.var\"#_register_kinds!##0#_register_kinds!##1\")(n) @ Base.JuliaSyntax none:0",
"method_instance": "MethodInstance for (::Base.JuliaSyntax.var\"#_register_kinds!##0#_register_kinds!##1\"{Dict{String, UInt16}})(::String)"
},
"children": [
]
},
{
"method_instance": {
"method": "var\"@K_str\"(__source__::LineNumberNode, __module__::Module, s) @ Base.JuliaSyntax ~/tmp/jl/julia-git/invalidations_build/base/JuliaSyntax/src/kinds.jl:160",
"method_instance": "MethodInstance for var\"@K_str\"(::LineNumberNode, ::Module, ::Any)"
},
"children": [
]
}
]
}
]
}
]
},
{
"method_instance": {
"method": "docerror(ex) @ Base.Docs docs/Docs.jl:742",
"method_instance": "MethodInstance for Base.Docs.docerror(::Any)"
},
"children": [
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Bool)"
},
"children": [
]
},
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
},
"children": [
]
},
{
"method_instance": {
"method": "calldoc(__source__, __module__, str, def::Expr) @ Base.Docs docs/Docs.jl:386",
"method_instance": "MethodInstance for Base.Docs.calldoc(::Any, ::Any, ::Any, ::Expr)"
},
"children": [
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Bool)"
},
"children": [
]
},
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
},
"children": [
]
}
]
},
{
"method_instance": {
"method": "calldoc(__source__, __module__, str, def::Expr) @ Base.Docs docs/Docs.jl:386",
"method_instance": "MethodInstance for Base.Docs.calldoc(::LineNumberNode, ::Module, ::Any, ::Expr)"
},
"children": [
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Bool)"
},
"children": [
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Any, ::Any)"
},
"children": [
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Bool)"
},
"children": [
]
},
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
},
"children": [
]
}
]
},
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any)"
},
"children": [
]
},
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Bool)"
},
"children": [
]
},
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
},
"children": [
]
},
{
"method_instance": {
"method": "docm(source::LineNumberNode, mod::Module, meta, ex, define::Bool) @ Base.Docs docs/Docs.jl:639",
"method_instance": "MethodInstance for Base.Docs.docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Bool)"
},
"children": [
{
"method_instance": {
"method": "docm(source::LineNumberNode, mod::Module, ::Any, ::Any, x...) @ Base.Docs docs/Docs.jl:631",
"method_instance": "MethodInstance for Base.Docs.docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Any, ::Any, ::Vararg{Any})"
},
"children": [
]
},
{
"method_instance": {
"method": "docm(source::LineNumberNode, mod::Module, meta, ex) @ Base.Docs docs/Docs.jl:639",
"method_instance": "MethodInstance for Base.Docs.docm(::LineNumberNode, ::Module, ::Any, ::Any)"
},
"children": [
{
"method_instance": {
"method": "docm(source::LineNumberNode, mod::Module, ::Any, ::Any, x...) @ Base.Docs docs/Docs.jl:631",
"method_instance": "MethodInstance for Base.Docs.docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Any, ::Any, ::Vararg{Any})"
},
"children": [
]
}
]
},
{
"method_instance": {
"method": "loaddocs(docs::Base.CoreDocs.DocLinkedList) @ Base.Docs docs/Docs.jl:758",
"method_instance": "MethodInstance for Base.Docs.loaddocs(::Base.CoreDocs.DocLinkedList)"
},
"children": [
]
},
{
"method_instance": {
"method": "multidoc(__source__, __module__, meta, ex::Expr, define::Bool) @ Base.Docs docs/Docs.jl:418",
"method_instance": "MethodInstance for Base.Docs.multidoc(::Any, ::Any, ::Any, ::Expr, ::Bool)"
},
"children": [
]
},
{
"method_instance": {
"method": "multidoc(__source__, __module__, meta, ex::Expr, define::Bool) @ Base.Docs docs/Docs.jl:418",
"method_instance": "MethodInstance for Base.Docs.multidoc(::LineNumberNode, ::Module, ::Any, ::Expr, ::Bool)"
},
"children": [
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Bool)"
},
"children": [
]
}
]
},
{
"method_instance": {
"method": "multidoc(__source__, __module__, meta, ex::Expr, define::Bool) @ Base.Docs docs/Docs.jl:418",
"method_instance": "MethodInstance for Base.Docs.multidoc(::LineNumberNode, ::Module, ::Expr, ::Expr, ::Bool)"
},
"children": [
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
},
"children": [
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any)"
},
"children": [
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
},
"children": [
]
}
]
},
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
},
"children": [
]
},
{
"method_instance": {
"method": "docm(source::LineNumberNode, mod::Module, meta, ex, define::Bool) @ Base.Docs docs/Docs.jl:639",
"method_instance": "MethodInstance for Base.Docs.docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
},
"children": [
]
},
{
"method_instance": {
"method": "docm(source::LineNumberNode, mod::Module, meta, ex, define::Bool) @ Base.Docs docs/Docs.jl:639",
"method_instance": "MethodInstance for Base.Docs.docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
},
"children": [
{
"method_instance": {
"method": "multidoc(__source__, __module__, meta, ex::Expr, define::Bool) @ Base.Docs docs/Docs.jl:418",
"method_instance": "MethodInstance for Base.Docs.multidoc(::Any, ::Any, ::Any, ::Expr, ::Bool)"
},
"children": [
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Any, ::Any, ::Bool)"
},
"children": [
]
},
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
},
"children": [
]
}
]
},
{
"method_instance": {
"method": "multidoc(__source__, __module__, meta, ex::Expr, define::Bool) @ Base.Docs docs/Docs.jl:418",
"method_instance": "MethodInstance for Base.Docs.multidoc(::LineNumberNode, ::Module, ::Any, ::Expr, ::Bool)"
},
"children": [
]
},
{
"method_instance": {
"method": "multidoc(__source__, __module__, meta, ex::Expr, define::Bool) @ Base.Docs docs/Docs.jl:418",
"method_instance": "MethodInstance for Base.Docs.multidoc(::LineNumberNode, ::Module, ::Expr, ::Expr, ::Bool)"
},
"children": [
]
}
]
}
]
}
]
}
]
},
{
"method_instance": {
"method": "docm(source::LineNumberNode, mod::Module, meta, ex, define::Bool) @ Base.Docs docs/Docs.jl:639",
"method_instance": "MethodInstance for Base.Docs.docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
},
"children": [
]
},
{
"method_instance": {
"method": "docm(source::LineNumberNode, mod::Module, meta, ex, define::Bool) @ Base.Docs docs/Docs.jl:639",
"method_instance": "MethodInstance for Base.Docs.docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
},
"children": [
]
}
]
}
]
},
{
"method_instance": {
"method": "calldoc(__source__, __module__, str, def::Expr) @ Base.Docs docs/Docs.jl:386",
"method_instance": "MethodInstance for Base.Docs.calldoc(::LineNumberNode, ::Module, ::Expr, ::Expr)"
},
"children": [
{
"method_instance": {
"method": "_docm(source::LineNumberNode, mod::Module, meta, x, define::Bool) @ Base.Docs docs/Docs.jl:647",
"method_instance": "MethodInstance for Base.Docs._docm(::LineNumberNode, ::Module, ::Expr, ::Any, ::Bool)"
},
"children": [
]
}
]
}
]
},
{
"method_instance": {
"method": "tryparse_internal(::Type{BigInt}, s::AbstractString, startpos::Int64, endpos::Int64, base_::Integer, raise::Bool) @ Base.GMP gmp.jl:290",
"method_instance": "MethodInstance for Base.tryparse_internal(::Type{BigInt}, ::AbstractString, ::Int64, ::Int64, ::Int64, ::Bool)"
},
"children": [
{
"method_instance": {
"method": "var\"#tryparse#467\"(base::Union{Nothing, Integer}, ::typeof(tryparse), ::Type{T}, s::AbstractString) where T<:Integer @ Base parse.jl:248",
"method_instance": "MethodInstance for Base.var\"#tryparse#467\"(::Nothing, ::typeof(tryparse), ::Type{BigInt}, ::AbstractString)"
},
"children": [
{
"method_instance": {
"method": "tryparse(::Type{T}, s::AbstractString; base) where T<:Integer @ Base parse.jl:248",
"method_instance": "MethodInstance for tryparse(::Type{BigInt}, ::AbstractString)"
},
"children": [
{
"method_instance": {
"method": "var\"@big_str\"(__source__::LineNumberNode, __module__::Module, s) @ Base int.jl:698",
"method_instance": "MethodInstance for Core.var\"@big_str\"(::LineNumberNode, ::Module, ::Any)"
},
"children": [
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
}
]
} |
@aviatesk as you can see above, the
Even though we have For example:
|
Should get rid of some invalidation on running user code.