@@ -536,6 +536,12 @@ function finishinfer!(me::InferenceState, interp::AbstractInterpreter)
536
536
append! (s_edges, edges)
537
537
empty! (edges)
538
538
end
539
+ # s_edges_new = compute_edges(me)
540
+ # println(Any[z isa MethodTable ? z.name : z for z in s_edges_new])
541
+ # if length(s_edges) != length(s_edges_new) || !all(i -> isassigned(s_edges, i) ? isassigned(s_edges_new, i) && s_edges_new[i] === s_edges[i] : !isassigned(s_edges_new, i), length(s_edges))
542
+ # println(sizehint!(s_edges, length(s_edges)))
543
+ # println(sizehint!(s_edges_new, length(s_edges_new)))
544
+ # end
539
545
if me. src. edges != = nothing && me. src. edges != = Core. svec ()
540
546
append! (s_edges, me. src. edges:: Vector )
541
547
end
@@ -653,6 +659,92 @@ function store_backedges(caller::MethodInstance, edges::Vector{Any})
653
659
return nothing
654
660
end
655
661
662
+ add_edges! (edges:: Vector{Any} , info:: MethodResultPure ) = add_edges! (edges, info. info)
663
+ add_edges! (edges:: Vector{Any} , info:: ConstCallInfo ) = add_edges! (edges, info. call)
664
+ add_edges! (edges:: Vector{Any} , info:: OpaqueClosureCreateInfo ) = nothing # TODO (jwn)
665
+ add_edges! (edges:: Vector{Any} , info:: ReturnTypeCallInfo ) = add_edges! (edges, info. info)
666
+ function add_edges! (edges:: Vector{Any} , info:: ApplyCallInfo )
667
+ add_edges! (edges, info. call)
668
+ for arg in info. arginfo
669
+ arg === nothing && continue
670
+ for edge in arg. each
671
+ add_edges! (edges, edge. info)
672
+ end
673
+ end
674
+ end
675
+ add_edges! (edges:: Vector{Any} , info:: ModifyOpInfo ) = add_edges! (edges, info. call)
676
+ add_edges! (edges:: Vector{Any} , info:: UnionSplitInfo ) = for split in info. matches; add_edges! (edges, split); end
677
+ add_edges! (edges:: Vector{Any} , info:: UnionSplitApplyCallInfo ) = for split in info. infos; add_edges! (edges, split); end
678
+ add_edges! (edges:: Vector{Any} , info:: FinalizerInfo ) = nothing
679
+ add_edges! (edges:: Vector{Any} , info:: NoCallInfo ) = nothing
680
+ function add_edges! (edges:: Vector{Any} , info:: MethodMatchInfo )
681
+ matches = info. results. matches
682
+ # if length(matches) == 1 && !info.results.ambig && (matches[end]::Core.MethodMatch).fully_covers
683
+ # push!(edges, specialize_method(matches[1]))
684
+ # elseif isempty(matches) || info.results.ambig || !(matches[end]::Core.MethodMatch).fully_covers
685
+ # else
686
+ # push!(edges, length(matches))
687
+ # for m in matches
688
+ # push!(edges, specialize_method(m))
689
+ # end
690
+ # end
691
+ if isempty (matches) || ! (matches[end ]:: Core.MethodMatch ). fully_covers
692
+ exists = false
693
+ for i in 1 : length (edges)
694
+ if edges[i] === info. mt && edges[i + 1 ] == info. atype
695
+ exists = true
696
+ break
697
+ end
698
+ end
699
+ if ! exists
700
+ push! (edges, info. mt)
701
+ push! (edges, info. atype)
702
+ end
703
+ end
704
+ for m in matches
705
+ mi = specialize_method (m)
706
+ exists = false
707
+ for i in 1 : length (edges)
708
+ if edges[i] === mi && ! (i > 1 && edges[i - 1 ] isa Type)
709
+ exists = true
710
+ break
711
+ end
712
+ end
713
+ exists || push! (edges, mi)
714
+ end
715
+ end
716
+ function add_edges! (edges:: Vector{Any} , info:: InvokeCallInfo )
717
+ # push!(edges, 1)
718
+ mi = specialize_method (info. match)
719
+ exists = false
720
+ for i in 2 : length (edges)
721
+ if edges[i] === mi && edges[i - 1 ] isa Type && edges[i - 1 ] == info. atype
722
+ exists = true
723
+ break
724
+ end
725
+ end
726
+ if ! exists
727
+ push! (edges, info. atype)
728
+ push! (edges, mi)
729
+ end
730
+ nothing
731
+ end
732
+
733
+ function compute_edges (sv:: InferenceState )
734
+ edges = []
735
+ for i in 1 : length (sv. stmt_info)
736
+ info = sv. stmt_info[i]
737
+ # rt = sv.ssavaluetypes[i]
738
+ # effects = EFFECTS_TOTAL # sv.stmt_effects[i]
739
+ # if rt === Any && effects === Effects()
740
+ # continue
741
+ # end
742
+ add_edges! (edges, info)
743
+ end
744
+ return edges
745
+ end
746
+
747
+
656
748
function record_slot_assign! (sv:: InferenceState )
657
749
# look at all assignments to slots
658
750
# and union the set of types stored there
0 commit comments