File 5122-beam_ssa_pre_codegen-Optimize-the-find_yregs-sub-pas.patch of Package erlang
From b0d2c5afa9574900b37946a164cb165b37e95ff7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org>
Date: Thu, 20 Jan 2022 13:45:44 +0100
Subject: [PATCH 2/2] beam_ssa_pre_codegen: Optimize the find_yregs sub pass
This optimization make the `beam_ssa_pre_codegen` pass about
twice as fast for the example in #5140.
---
lib/compiler/src/beam_ssa_pre_codegen.erl | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/lib/compiler/src/beam_ssa_pre_codegen.erl b/lib/compiler/src/beam_ssa_pre_codegen.erl
index 10bb5dc59f..23cfe27f80 100644
--- a/lib/compiler/src/beam_ssa_pre_codegen.erl
+++ b/lib/compiler/src/beam_ssa_pre_codegen.erl
@@ -1783,7 +1783,7 @@ find_yregs(#st{frames=[_|_]=Frames,args=Args,ssa=Blocks0}=St) ->
find_yregs_1([{F,Defs}|Fs], Blocks0) ->
DK = #dk{d=Defs,k=sets:new([{version, 2}])},
- D0 = #{F=>DK},
+ D0 = #{F => DK,?EXCEPTION_BLOCK => DK#dk{d=[]}},
Ls = beam_ssa:rpo([F], Blocks0),
Yregs0 = sets:new([{version, 2}]),
Yregs = find_yregs_2(Ls, Blocks0, D0, Yregs0),
@@ -1836,6 +1836,8 @@ find_defs_is([#b_set{dst=Dst}|Is], Acc) ->
find_defs_is(Is, [Dst|Acc]);
find_defs_is([], Acc) -> Acc.
+find_update_succ([?EXCEPTION_BLOCK|Ss], DK, D) ->
+ find_update_succ(Ss, DK, D);
find_update_succ([S|Ss], #dk{d=Defs0,k=Killed0}=DK0, D0) ->
case D0 of
#{S:=#dk{d=Defs1,k=Killed1}} ->
--
2.31.1