Revision 1510eaa93e60c9c8d7e92fd1d296b78ded49d52e authored by Shuhei Kadowaki on 24 October 2021, 16:35:12 UTC, committed by Shuhei Kadowaki on 26 October 2021, 12:28:27 UTC
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, :a::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, :a::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
)
```
1 parent 2e388e3
Raw File
CITATION.cff
cff-version: 1.2.0
message: "Cite this paper whenever you use Julia"
authors:
- family-names: "Bezanson"
  given-names: "Jeff"
- family-names: "Edelman"
  given-names: "Alan"
- family-names: "Karpinski"
  given-names: "Stefan"
- family-names: "Shah"
  given-names: "Viral B."
title: "Julia: A fresh approach to numerical computing"
version: "v1"
license: "MIT"
doi: "10.1137/141000671"
date-released: 2017-02-07
url: "https://julialang.org"
preferred-citation:
  authors:
    - family-names: "Bezanson"
      given-names: "Jeff"
    - family-names: "Edelman"
      given-names: "Alan"
    - family-names: "Karpinski"
      given-names: "Stefan"
    - family-names: "Shah"
      given-names: "Viral B."
  doi: "10.1137/141000671"
  journal: "SIAM Review"
  month: 9
  start: 65
  end: 98
  pages: 33
  title: "Julia: A fresh approach to numerical computing"
  type: article
  volume: 59
  issue: 1
  year: 2017
  publisher:
    - name: "SIAM"
back to top