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

openSUSE Build Service is sponsored by