@@ -536,6 +536,12 @@ function finishinfer!(me::InferenceState, interp::AbstractInterpreter)
536536 append! (s_edges, edges)
537537 empty! (edges)
538538 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
539545 if me. src. edges != = nothing && me. src. edges != = Core. svec ()
540546 append! (s_edges, me. src. edges:: Vector )
541547 end
@@ -653,6 +659,92 @@ function store_backedges(caller::MethodInstance, edges::Vector{Any})
653659 return nothing
654660end
655661
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+
656748function record_slot_assign! (sv:: InferenceState )
657749 # look at all assignments to slots
658750 # and union the set of types stored there
0 commit comments