@@ -12,6 +12,8 @@ struct InliningTodo
1212 mi:: MethodInstance
1313 # The IR of the inlinee
1414 ir:: IRCode
15+ # The SpecInfo for the inlinee
16+ spec_info:: SpecInfo
1517 # The DebugInfo table for the inlinee
1618 di:: DebugInfo
1719 # If the function being inlined is a single basic block we can use a
@@ -20,8 +22,8 @@ struct InliningTodo
2022 # Effects of the call statement
2123 effects:: Effects
2224end
23- function InliningTodo (mi:: MethodInstance , (ir, di) :: Tuple{IRCode, DebugInfo} , effects:: Effects )
24- return InliningTodo (mi, ir, di, linear_inline_eligible (ir), effects)
25+ function InliningTodo (mi:: MethodInstance , ir :: IRCode , spec_info :: SpecInfo , di :: DebugInfo , effects:: Effects )
26+ return InliningTodo (mi, ir, spec_info, di, linear_inline_eligible (ir), effects)
2527end
2628
2729struct ConstantCase
@@ -321,7 +323,8 @@ function ir_inline_linetable!(debuginfo::DebugInfoStream, inlinee_debuginfo::Deb
321323end
322324
323325function ir_prepare_inlining! (insert_node!:: Inserter , inline_target:: Union{IRCode, IncrementalCompact} ,
324- ir:: IRCode , di:: DebugInfo , mi:: MethodInstance , inlined_at:: NTuple{3,Int32} , argexprs:: Vector{Any} )
326+ ir:: IRCode , spec_info:: SpecInfo , di:: DebugInfo , mi:: MethodInstance ,
327+ inlined_at:: NTuple{3,Int32} , argexprs:: Vector{Any} )
325328 def = mi. def:: Method
326329 debuginfo = inline_target isa IRCode ? inline_target. debuginfo : inline_target. ir. debuginfo
327330 topline = new_inlined_at = ir_inline_linetable! (debuginfo, di, inlined_at)
@@ -334,8 +337,8 @@ function ir_prepare_inlining!(insert_node!::Inserter, inline_target::Union{IRCod
334337 spvals_ssa = insert_node! (
335338 removable_if_unused (NewInstruction (Expr (:call , Core. _compute_sparams, def, argexprs... ), SimpleVector, topline)))
336339 end
337- if def . isva
338- nargs_def = Int (def . nargs:: Int32 )
340+ if spec_info . isva
341+ nargs_def = spec_info . nargs
339342 if nargs_def > 0
340343 argexprs = fix_va_argexprs! (insert_node!, inline_target, argexprs, nargs_def, topline)
341344 end
@@ -362,7 +365,7 @@ function ir_inline_item!(compact::IncrementalCompact, idx::Int, argexprs::Vector
362365 item:: InliningTodo , boundscheck:: Symbol , todo_bbs:: Vector{Tuple{Int, Int}} )
363366 # Ok, do the inlining here
364367 inlined_at = compact. result[idx][:line ]
365- ssa_substitute = ir_prepare_inlining! (InsertHere (compact), compact, item. ir, item. di, item. mi, inlined_at, argexprs)
368+ ssa_substitute = ir_prepare_inlining! (InsertHere (compact), compact, item. ir, item. spec_info, item . di, item. mi, inlined_at, argexprs)
366369 boundscheck = has_flag (compact. result[idx], IR_FLAG_INBOUNDS) ? :off : boundscheck
367370
368371 # If the iterator already moved on to the next basic block,
@@ -860,15 +863,14 @@ function resolve_todo(mi::MethodInstance, result::Union{Nothing,InferenceResult,
860863 if inferred_result isa ConstantCase
861864 add_inlining_backedge! (et, mi)
862865 return inferred_result
863- end
864- if inferred_result isa InferredResult
866+ elseif inferred_result isa InferredResult
865867 (; src, effects) = inferred_result
866868 elseif inferred_result isa CodeInstance
867869 src = @atomic :monotonic inferred_result. inferred
868870 effects = decode_effects (inferred_result. ipo_purity_bits)
869- else
870- src = nothing
871- effects = Effects ( )
871+ else # there is no cached source available, bail out
872+ return compileable_specialization (mi, Effects (), et, info;
873+ compilesig_invokes = OptimizationParams (state . interp) . compilesig_invokes )
872874 end
873875
874876 # the duplicated check might have been done already within `analyze_method!`, but still
@@ -883,9 +885,12 @@ function resolve_todo(mi::MethodInstance, result::Union{Nothing,InferenceResult,
883885 compilesig_invokes= OptimizationParams (state. interp). compilesig_invokes)
884886
885887 add_inlining_backedge! (et, mi)
886- ir = inferred_result isa CodeInstance ? retrieve_ir_for_inlining (inferred_result, src) :
887- retrieve_ir_for_inlining (mi, src, preserve_local_sources)
888- return InliningTodo (mi, ir, effects)
888+ if inferred_result isa CodeInstance
889+ ir, spec_info, debuginfo = retrieve_ir_for_inlining (inferred_result, src)
890+ else
891+ ir, spec_info, debuginfo = retrieve_ir_for_inlining (mi, src, preserve_local_sources)
892+ end
893+ return InliningTodo (mi, ir, spec_info, debuginfo, effects)
889894end
890895
891896# the special resolver for :invoke-d call
@@ -901,23 +906,17 @@ function resolve_todo(mi::MethodInstance, @nospecialize(info::CallInfo), flag::U
901906 if cached_result isa ConstantCase
902907 add_inlining_backedge! (et, mi)
903908 return cached_result
904- end
905- if cached_result isa InferredResult
906- (; src, effects) = cached_result
907909 elseif cached_result isa CodeInstance
908910 src = @atomic :monotonic cached_result. inferred
909911 effects = decode_effects (cached_result. ipo_purity_bits)
910- else
911- src = nothing
912- effects = Effects ()
912+ else # there is no cached source available, bail out
913+ return nothing
913914 end
914915
915- preserve_local_sources = true
916916 src_inlining_policy (state. interp, src, info, flag) || return nothing
917- ir = cached_result isa CodeInstance ? retrieve_ir_for_inlining (cached_result, src) :
918- retrieve_ir_for_inlining (mi, src, preserve_local_sources)
917+ ir, spec_info, debuginfo = retrieve_ir_for_inlining (cached_result, src)
919918 add_inlining_backedge! (et, mi)
920- return InliningTodo (mi, ir, effects)
919+ return InliningTodo (mi, ir, spec_info, debuginfo, effects)
921920end
922921
923922function validate_sparams (sparams:: SimpleVector )
@@ -971,22 +970,29 @@ function analyze_method!(match::MethodMatch, argtypes::Vector{Any},
971970 return resolve_todo (mi, volatile_inf_result, info, flag, state; invokesig)
972971end
973972
974- function retrieve_ir_for_inlining (cached_result:: CodeInstance , src:: MaybeCompressed )
975- src = _uncompressed_ir (cached_result, src):: CodeInfo
976- return inflate_ir! (src, cached_result. def), src. debuginfo
973+ function retrieve_ir_for_inlining (cached_result:: CodeInstance , src:: String )
974+ src = _uncompressed_ir (cached_result, src)
975+ return inflate_ir! (src, cached_result. def), SpecInfo (src), src. debuginfo
976+ end
977+ function retrieve_ir_for_inlining (cached_result:: CodeInstance , src:: CodeInfo )
978+ return inflate_ir! (copy (src), cached_result. def), SpecInfo (src), src. debuginfo
977979end
978980function retrieve_ir_for_inlining (mi:: MethodInstance , src:: CodeInfo , preserve_local_sources:: Bool )
979981 if preserve_local_sources
980982 src = copy (src)
981983 end
982- return inflate_ir! (src, mi), src. debuginfo
984+ return inflate_ir! (src, mi), SpecInfo (src), src. debuginfo
983985end
984986function retrieve_ir_for_inlining (mi:: MethodInstance , ir:: IRCode , preserve_local_sources:: Bool )
985987 if preserve_local_sources
986988 ir = copy (ir)
987989 end
990+ # COMBAK this is not correct, we should make `InferenceResult` propagate `SpecInfo`
991+ spec_info = let m = mi. def:: Method
992+ SpecInfo (Int (m. nargs), m. isva, false , nothing )
993+ end
988994 ir. debuginfo. def = mi
989- return ir, DebugInfo (ir. debuginfo, length (ir. stmts))
995+ return ir, spec_info, DebugInfo (ir. debuginfo, length (ir. stmts))
990996end
991997
992998function handle_single_case! (todo:: Vector{Pair{Int,Any}} ,
@@ -1466,8 +1472,8 @@ function semiconcrete_result_item(result::SemiConcreteResult,
14661472
14671473 add_inlining_backedge! (et, mi)
14681474 preserve_local_sources = OptimizationParams (state. interp). preserve_local_sources
1469- ir = retrieve_ir_for_inlining (mi, result. ir, preserve_local_sources)
1470- return InliningTodo (mi, ir, result. effects)
1475+ ir, _, debuginfo = retrieve_ir_for_inlining (mi, result. ir, preserve_local_sources)
1476+ return InliningTodo (mi, ir, result. spec_info, debuginfo, result . effects)
14711477end
14721478
14731479function handle_semi_concrete_result! (cases:: Vector{InliningCase} , result:: SemiConcreteResult ,
0 commit comments