Skip to content

Commit c4be5cc

Browse files
committed
wip: overhaul EscapeAnalysis.jl (local analysis only)
- switched to the working set & flow-sensitive algorithm - implemented the new alias analysis design - added more tests
1 parent 3508957 commit c4be5cc

File tree

7 files changed

+1779
-1233
lines changed

7 files changed

+1779
-1233
lines changed

Compiler/src/optimize.jl

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -669,12 +669,13 @@ end
669669

670670
function refine_effects!(interp::AbstractInterpreter, opt::OptimizationState, sv::PostOptAnalysisState)
671671
if !is_effect_free(sv.result.ipo_effects) && sv.all_effect_free && !isempty(sv.ea_analysis_pending)
672-
ir = sv.ir
673-
nargs = Int(opt.src.nargs)
674-
estate = EscapeAnalysis.analyze_escapes(ir, nargs, optimizer_lattice(interp), get_escape_cache(interp))
675-
argescapes = EscapeAnalysis.ArgEscapeCache(estate)
676-
stack_analysis_result!(sv.result, argescapes)
677-
validate_mutable_arg_escapes!(estate, sv)
672+
# ir = sv.ir
673+
# nargs = Int(opt.src.nargs)
674+
# eresult = EscapeAnalysis.analyze_escapes(ir, nargs, optimizer_lattice(interp), get_escape_cache(interp))
675+
# argescapes = EscapeAnalysis.ArgEscapeCache(eresult)
676+
# stack_analysis_result!(sv.result, argescapes)
677+
# validate_mutable_arg_escapes!(eresult, sv)
678+
sv.all_effect_free = false
678679
end
679680

680681
any_refinable(sv) || return false
@@ -716,7 +717,7 @@ function iscall_with_boundscheck(@nospecialize(stmt), sv::PostOptAnalysisState)
716717
end
717718

718719
function check_all_args_noescape!(sv::PostOptAnalysisState, ir::IRCode, @nospecialize(stmt),
719-
estate::EscapeAnalysis.EscapeState)
720+
eresult::EscapeAnalysis.EscapeResult)
720721
stmt isa Expr || return false
721722
if isexpr(stmt, :invoke)
722723
startidx = 2
@@ -735,7 +736,7 @@ function check_all_args_noescape!(sv::PostOptAnalysisState, ir::IRCode, @nospeci
735736
end
736737
# See if we can find the allocation
737738
if isa(arg, Argument)
738-
if has_no_escape(estate[arg])
739+
if has_no_escape(eresult[arg])
739740
# Even if we prove everything else effect_free, the best we can
740741
# say is :effect_free_if_argmem_only
741742
if sv.effect_free_if_argmem_only === nothing
@@ -746,23 +747,23 @@ function check_all_args_noescape!(sv::PostOptAnalysisState, ir::IRCode, @nospeci
746747
end
747748
return false
748749
elseif isa(arg, SSAValue)
749-
has_no_escape(estate[arg]) || return false
750-
check_all_args_noescape!(sv, ir, ir[arg][:stmt], estate) || return false
750+
has_no_escape(eresult[arg]) || return false
751+
check_all_args_noescape!(sv, ir, ir[arg][:stmt], eresult) || return false
751752
else
752753
return false
753754
end
754755
end
755756
return true
756757
end
757758

758-
function validate_mutable_arg_escapes!(estate::EscapeAnalysis.EscapeState, sv::PostOptAnalysisState)
759+
function validate_mutable_arg_escapes!(eresult::EscapeAnalysis.EscapeResult, sv::PostOptAnalysisState)
759760
ir = sv.ir
760761
for idx in sv.ea_analysis_pending
761762
# See if any mutable memory was allocated in this function and determined
762763
# not to escape.
763764
inst = ir[SSAValue(idx)]
764765
stmt = inst[:stmt]
765-
if !check_all_args_noescape!(sv, ir, stmt, estate)
766+
if !check_all_args_noescape!(sv, ir, stmt, eresult)
766767
return sv.all_effect_free = false
767768
end
768769
end

0 commit comments

Comments
 (0)