diff --git a/base/compiler/ssair/inlining2.jl b/base/compiler/ssair/inlining2.jl index 20243203e6f7c..394444cae694f 100644 --- a/base/compiler/ssair/inlining2.jl +++ b/base/compiler/ssair/inlining2.jl @@ -379,11 +379,22 @@ function ir_inline_unionsplit!(compact::IncrementalCompact, topmod::Module, idx: insert_node_here!(compact, GotoIfNot(cond, next_cond_bb), Union{}, line) bb = next_cond_bb - 1 finish_current_bb!(compact) - # Insert Pi nodes here + argexprs′ = argexprs + if !isa(case, ConstantCase) + argexprs′ = copy(argexprs) + for i = 2:length(metharg.parameters) + a, m = atype.parameters[i], metharg.parameters[i] + isa(argexprs[i], SSAValue) || continue + if !(a <: m) + argexprs′[i] = insert_node_here!(compact, PiNode(argexprs′[i], m), + m, line) + end + end + end if isa(case, InliningTodo) - val = ir_inline_item!(compact, idx, argexprs, linetable, case, boundscheck, todo_bbs) + val = ir_inline_item!(compact, idx, argexprs′, linetable, case, boundscheck, todo_bbs) elseif isa(case, MethodInstance) - val = insert_node_here!(compact, Expr(:invoke, case, argexprs...), typ, line) + val = insert_node_here!(compact, Expr(:invoke, case, argexprs′...), typ, line) else case = case::ConstantCase val = case.val