Skip to content
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

optimizer: eliminate more isdefined checks #44755

Merged
merged 1 commit into from
Mar 28, 2022
Merged

Commits on Mar 26, 2022

  1. optimizer: eliminate more isdefined checks

    Follows up #44708 -- in that PR I missed the most obvious optimization
    opportunity, i.e. we can safely eliminate `isdefined` checks when all
    fields are defined at allocation site.
    This change allows us to eliminate capturing closure constructions when
    the body and callsite of capture closure is available within a optimized
    frame, e.g.:
    ```julia
    function abmult(r::Int, x0)
        if r < 0
            r = -r
        end
        f = x -> x * r
        return @inline f(x0)
    end
    ```
    ```diff
    diff --git a/_master.jl b/_pr.jl
    index ea06d865b75..c38f221090f 100644
    --- a/_master.jl
    +++ b/_pr.jl
    @@ -1,24 +1,19 @@
     julia> @code_typed abmult(-3, 3)
     CodeInfo(
    -1 ── %1  = Core.Box::Type{Core.Box}
    -│    %2  = %new(%1, r@_2)::Core.Box
    -│    %3  = Core.isdefined(%2, :contents)::Bool
    -└───       goto #3 if not %3
    +1 ──       goto #3 if not true
     2 ──       goto #4
     3 ──       $(Expr(:throw_undef_if_not, :r, false))::Any
    -4 ┄─ %7  = (r@_2 < 0)::Any
    -└───       goto #9 if not %7
    -5 ── %9  = Core.isdefined(%2, :contents)::Bool
    -└───       goto #7 if not %9
    +4 ┄─ %4  = (r@_2 < 0)::Any
    +└───       goto #9 if not %4
    +5 ──       goto #7 if not true
     6 ──       goto #8
     7 ──       $(Expr(:throw_undef_if_not, :r, false))::Any
    -8 ┄─ %13 = -r@_2::Any
    -9 ┄─ %14 = φ (#4 => r@_2, #8 => %13)::Any
    -│    %15 = Core.isdefined(%2, :contents)::Bool
    -└───       goto #11 if not %15
    +8 ┄─ %9  = -r@_2::Any
    +9 ┄─ %10 = φ (#4 => r@_2, #8 => %9)::Any
    +└───       goto #11 if not true
     10 ─       goto #12
     11 ─       $(Expr(:throw_undef_if_not, :r, false))::Any
    -12 ┄ %19 = (x0 * %14)::Any
    +12 ┄ %14 = (x0 * %10)::Any
     └───       goto #13
    -13 ─       return %19
    +13 ─       return %14
     ) => Any
    ```
    aviatesk committed Mar 26, 2022
    Configuration menu
    Copy the full SHA
    9b5f60f View commit details
    Browse the repository at this point in the history