@@ -838,7 +838,7 @@ function compileable_specialization(match::MethodMatch, effects::Effects,
838
838
end
839
839
840
840
struct InferredResult
841
- src:: Any
841
+ src:: Any # CodeInfo or IRCode
842
842
effects:: Effects
843
843
InferredResult (@nospecialize (src), effects:: Effects ) = new (src, effects)
844
844
end
849
849
# in this case function can be inlined to a constant
850
850
return ConstantCase (quoted (code. rettype_const))
851
851
end
852
- src = @atomic :monotonic code. inferred
853
- effects = decode_effects (code. ipo_purity_bits)
854
- return InferredResult (src, effects)
852
+ return code
855
853
end
856
- return InferredResult ( nothing , Effects ())
854
+ return nothing
857
855
end
858
856
@inline function get_local_result (inf_result:: InferenceResult )
859
857
effects = inf_result. ipo_effects
@@ -887,7 +885,15 @@ function resolve_todo(mi::MethodInstance, result::Union{Nothing,InferenceResult,
887
885
add_inlining_backedge! (et, mi)
888
886
return inferred_result
889
887
end
890
- (; src, effects) = inferred_result
888
+ if inferred_result isa InferredResult
889
+ (; src, effects) = inferred_result
890
+ elseif inferred_result isa CodeInstance
891
+ src = @atomic :monotonic inferred_result. inferred
892
+ effects = decode_effects (inferred_result. ipo_purity_bits)
893
+ else
894
+ src = nothing
895
+ effects = Effects ()
896
+ end
891
897
892
898
# the duplicated check might have been done already within `analyze_method!`, but still
893
899
# we need it here too since we may come here directly using a constant-prop' result
@@ -896,12 +902,13 @@ function resolve_todo(mi::MethodInstance, result::Union{Nothing,InferenceResult,
896
902
compilesig_invokes= OptimizationParams (state. interp). compilesig_invokes)
897
903
end
898
904
899
- src = inlining_policy (state. interp, src, info, flag)
900
- src === nothing && return compileable_specialization (mi, effects, et, info;
901
- compilesig_invokes= OptimizationParams (state. interp). compilesig_invokes)
905
+ src_inlining_policy (state. interp, src, info, flag) ||
906
+ return compileable_specialization (mi, effects, et, info;
907
+ compilesig_invokes= OptimizationParams (state. interp). compilesig_invokes)
902
908
903
909
add_inlining_backedge! (et, mi)
904
- ir = retrieve_ir_for_inlining (mi, src, preserve_local_sources)
910
+ ir = inferred_result isa CodeInstance ? retrieve_ir_for_inlining (inferred_result, src) :
911
+ retrieve_ir_for_inlining (mi, src, preserve_local_sources)
905
912
return InliningTodo (mi, ir, effects)
906
913
end
907
914
@@ -919,14 +926,22 @@ function resolve_todo(mi::MethodInstance, @nospecialize(info::CallInfo), flag::U
919
926
add_inlining_backedge! (et, mi)
920
927
return cached_result
921
928
end
922
- (; src, effects) = cached_result
923
-
924
- src = inlining_policy (state. interp, src, info, flag)
925
-
926
- src === nothing && return nothing
929
+ if cached_result isa InferredResult
930
+ (; src, effects) = cached_result
931
+ elseif cached_result isa CodeInstance
932
+ src = @atomic :monotonic cached_result. inferred
933
+ effects = decode_effects (cached_result. ipo_purity_bits)
934
+ else
935
+ src = nothing
936
+ effects = Effects ()
937
+ end
927
938
939
+ preserve_local_sources = true
940
+ src_inlining_policy (state. interp, src, info, flag) || return nothing
941
+ ir = cached_result isa CodeInstance ? retrieve_ir_for_inlining (cached_result, src) :
942
+ retrieve_ir_for_inlining (mi, src, preserve_local_sources)
928
943
add_inlining_backedge! (et, mi)
929
- return InliningTodo (mi, retrieve_ir_for_inlining (mi, src) , effects)
944
+ return InliningTodo (mi, ir , effects)
930
945
end
931
946
932
947
function validate_sparams (sparams:: SimpleVector )
@@ -979,17 +994,17 @@ function analyze_method!(match::MethodMatch, argtypes::Vector{Any},
979
994
return resolve_todo (mi, volatile_inf_result, info, flag, state; invokesig)
980
995
end
981
996
982
- function retrieve_ir_for_inlining (mi :: MethodInstance , src:: String , :: Bool = true )
983
- src = _uncompressed_ir (mi . def , src)
984
- return inflate_ir! (src, mi )
997
+ function retrieve_ir_for_inlining (cached_result :: CodeInstance , src:: MaybeCompressed )
998
+ src = _uncompressed_ir (cached_result , src):: CodeInfo
999
+ return inflate_ir! (src, cached_result . def )
985
1000
end
986
- function retrieve_ir_for_inlining (mi:: MethodInstance , src:: CodeInfo , preserve_local_sources:: Bool = true )
1001
+ function retrieve_ir_for_inlining (mi:: MethodInstance , src:: CodeInfo , preserve_local_sources:: Bool )
987
1002
if preserve_local_sources
988
1003
src = copy (src)
989
1004
end
990
1005
return inflate_ir! (src, mi)
991
1006
end
992
- function retrieve_ir_for_inlining (:: MethodInstance , ir:: IRCode , preserve_local_sources:: Bool = true )
1007
+ function retrieve_ir_for_inlining (mi :: MethodInstance , ir:: IRCode , preserve_local_sources:: Bool )
993
1008
if preserve_local_sources
994
1009
ir = copy (ir)
995
1010
end
@@ -1494,13 +1509,13 @@ function semiconcrete_result_item(result::SemiConcreteResult,
1494
1509
return compileable_specialization (mi, result. effects, et, info;
1495
1510
compilesig_invokes= OptimizationParams (state. interp). compilesig_invokes)
1496
1511
end
1497
- ir = inlining_policy (state. interp, result. ir, info, flag)
1498
- ir === nothing && return compileable_specialization (mi, result. effects, et, info;
1499
- compilesig_invokes= OptimizationParams (state. interp). compilesig_invokes)
1512
+ src_inlining_policy (state. interp, result. ir, info, flag) ||
1513
+ return compileable_specialization (mi, result. effects, et, info;
1514
+ compilesig_invokes= OptimizationParams (state. interp). compilesig_invokes)
1500
1515
1501
1516
add_inlining_backedge! (et, mi)
1502
1517
preserve_local_sources = OptimizationParams (state. interp). preserve_local_sources
1503
- ir = retrieve_ir_for_inlining (mi, ir, preserve_local_sources)
1518
+ ir = retrieve_ir_for_inlining (mi, result . ir, preserve_local_sources)
1504
1519
return InliningTodo (mi, ir, result. effects)
1505
1520
end
1506
1521
0 commit comments