Skip to content

Commit 429d022

Browse files
committed
Handle SemiConcreteResult in opaque closure inlining
1 parent b76239f commit 429d022

File tree

1 file changed

+23
-10
lines changed

1 file changed

+23
-10
lines changed

base/compiler/ssair/inlining.jl

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1466,21 +1466,27 @@ function handle_const_prop_result!(cases::Vector{InliningCase},
14661466
return true
14671467
end
14681468

1469-
function handle_semi_concrete_result!(cases::Vector{InliningCase}, result::SemiConcreteResult,
1470-
@nospecialize(info::CallInfo), flag::UInt8, state::InliningState;
1471-
allow_abstract::Bool)
1469+
function semiconcrete_result_item(result::SemiConcreteResult,
1470+
@nospecialize(info::CallInfo), flag::UInt8, state::InliningState)
14721471
mi = result.mi
1473-
spec_types = mi.specTypes
1474-
allow_abstract || isdispatchtuple(spec_types) || return false
1475-
validate_sparams(mi.sparam_vals) || return false
14761472
if !state.params.inlining || is_stmt_noinline(flag)
14771473
et = InliningEdgeTracker(state.et, nothing)
1478-
item = compileable_specialization(mi, result.effects, et, info;
1474+
return compileable_specialization(mi, result.effects, et, info;
14791475
compilesig_invokes=state.params.compilesig_invokes)
1480-
item === nothing && return false
14811476
else
1482-
item = InliningTodo(mi, result.ir, result.effects)
1477+
return InliningTodo(mi, result.ir, result.effects)
14831478
end
1479+
end
1480+
1481+
function handle_semi_concrete_result!(cases::Vector{InliningCase}, result::SemiConcreteResult,
1482+
@nospecialize(info::CallInfo), flag::UInt8, state::InliningState;
1483+
allow_abstract::Bool)
1484+
mi = result.mi
1485+
spec_types = mi.specTypes
1486+
allow_abstract || isdispatchtuple(spec_types) || return false
1487+
validate_sparams(mi.sparam_vals) || return false
1488+
item = semiconcrete_result_item(result, info, flag, state)
1489+
item === nothing && return false
14841490
push!(cases, InliningCase(spec_types, item))
14851491
return true
14861492
end
@@ -1538,7 +1544,14 @@ function handle_opaque_closure_call!(todo::Vector{Pair{Int,Any}},
15381544
elseif isa(result, ConcreteResult)
15391545
item = concrete_result_item(result, info, state)
15401546
else
1541-
item = analyze_method!(info.match, sig.argtypes, info, flag, state; allow_typevars=false)
1547+
if isa(result, SemiConcreteResult)
1548+
result = inlining_policy(state.interp, result, info, flag, result.mi, sig.argtypes)
1549+
end
1550+
if isa(result, SemiConcreteResult)
1551+
item = semiconcrete_result_item(result, info, flag, state)
1552+
else
1553+
item = analyze_method!(info.match, sig.argtypes, info, flag, state; allow_typevars=false)
1554+
end
15421555
end
15431556
handle_single_case!(todo, ir, idx, stmt, item, state.params)
15441557
return nothing

0 commit comments

Comments
 (0)