You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit complements #39754 and #39305: implements a logic to use
constant-prop'ed results for inlining at union-split callsite.
Currently it works only for cases when constant-prop' succeeded for all
(union-split) signatures.
> example
```julia
julia> mutable struct X
# NOTE in order to confuse `fieldtype_tfunc`, we need to have at least two fields with different types
a::Union{Nothing, Int}
b::Symbol
end;
julia> code_typed((X, Union{Nothing,Int})) do x, a
# this `setproperty` call would be union-split and constant-prop will happen for
# each signature: inlining would fail if we don't use constant-prop'ed source
# since the approximated inlining cost of `convert(fieldtype(X, sym), a)` would
# end up very high if we don't propagate `sym::Const(:a)`
x.a = a
x
end |> only |> first
```
> before this commit
```julia
CodeInfo(
1 ─ %1 = Base.setproperty!::typeof(setproperty!)
│ %2 = (isa)(a, Nothing)::Bool
└── goto #3 if not %2
2 ─ %4 = π (a, Nothing)
│ invoke %1(_2::X, 🅰️:Symbol, %4::Nothing)::Any
└── goto #6
3 ─ %7 = (isa)(a, Int64)::Bool
└── goto #5 if not %7
4 ─ %9 = π (a, Int64)
│ invoke %1(_2::X, 🅰️:Symbol, %9::Int64)::Any
└── goto #6
5 ─ Core.throw(ErrorException("fatal error in type inference (type bound)"))::Union{}
└── unreachable
6 ┄ return x
)
```
> after this commit
```julia
CodeInfo(
1 ─ %1 = (isa)(a, Nothing)::Bool
└── goto #3 if not %1
2 ─ Base.setfield!(x, :a, nothing)::Nothing
└── goto #6
3 ─ %5 = (isa)(a, Int64)::Bool
└── goto #5 if not %5
4 ─ %7 = π (a, Int64)
│ Base.setfield!(x, :a, %7)::Int64
└── goto #6
5 ─ Core.throw(ErrorException("fatal error in type inference (type bound)"))::Union{}
└── unreachable
6 ┄ return x
)
```
0 commit comments