Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:23
erlang
2792-beam_ssa_opt-Optimize-ssa_opt_live-2.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 2792-beam_ssa_opt-Optimize-ssa_opt_live-2.patch of Package erlang
From 899a4dcea57ccf66a245e494ebeb6271acf5e864 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org> Date: Thu, 5 Nov 2020 12:13:39 +0100 Subject: [PATCH 2/3] beam_ssa_opt: Optimize ssa_opt_live/2 Replace the of gb_sets with cerl_sets, resulting in a slight speed increase. --- lib/compiler/src/beam_ssa_opt.erl | 40 +++++++++++++++---------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/lib/compiler/src/beam_ssa_opt.erl b/lib/compiler/src/beam_ssa_opt.erl index 325c6da682..0b14e6eda3 100644 --- a/lib/compiler/src/beam_ssa_opt.erl +++ b/lib/compiler/src/beam_ssa_opt.erl @@ -1297,23 +1297,22 @@ ssa_opt_live({#opt_st{ssa=Linear0}=St, FuncDb}) -> live_opt([{L,Blk0}|Bs], LiveMap0, Blocks) -> Blk1 = beam_ssa_share:block(Blk0, Blocks), Successors = beam_ssa:successors(Blk1), - Live0 = live_opt_succ(Successors, L, LiveMap0, gb_sets:empty()), + Live0 = live_opt_succ(Successors, L, LiveMap0, cerl_sets:new()), {Blk,Live} = live_opt_blk(Blk1, Live0), LiveMap = live_opt_phis(Blk#b_blk.is, L, Live, LiveMap0), live_opt(Bs, LiveMap, Blocks#{L:=Blk}); live_opt([], _, Acc) -> Acc. live_opt_succ([S|Ss], L, LiveMap, Live0) -> - Key = {S,L}, case LiveMap of - #{Key:=Live} -> + #{{S,L}:=Live} -> %% The successor has a phi node, and the value for %% this block in the phi node is a variable. - live_opt_succ(Ss, L, LiveMap, gb_sets:union(Live, Live0)); + live_opt_succ(Ss, L, LiveMap, cerl_sets:union(Live0, Live)); #{S:=Live} -> %% No phi node in the successor, or the value for %% this block in the phi node is a literal. - live_opt_succ(Ss, L, LiveMap, gb_sets:union(Live, Live0)); + live_opt_succ(Ss, L, LiveMap, cerl_sets:union(Live0, Live)); #{} -> %% A peek_message block which has not been processed yet. live_opt_succ(Ss, L, LiveMap, Live0) @@ -1331,7 +1330,7 @@ live_opt_phis(Is, L, Live0, LiveMap0) -> case [{P,V} || {#b_var{}=V,P} <- PhiArgs] of [_|_]=PhiVars -> PhiLive0 = rel2fam(PhiVars), - PhiLive = [{{L,P},gb_sets:union(gb_sets:from_list(Vs), Live0)} || + PhiLive = [{{L,P},cerl_sets:union(cerl_sets:from_list(Vs), Live0)} || {P,Vs} <- PhiLive0], maps:merge(LiveMap, maps:from_list(PhiLive)); [] -> @@ -1341,12 +1340,13 @@ live_opt_phis(Is, L, Live0, LiveMap0) -> end. live_opt_blk(#b_blk{is=Is0,last=Last}=Blk, Live0) -> - Live1 = gb_sets:union(Live0, gb_sets:from_ordset(beam_ssa:used(Last))), + Live1 = cerl_sets:union(Live0, cerl_sets:from_list(beam_ssa:used(Last))), {Is,Live} = live_opt_is(reverse(Is0), Live1, []), {Blk#b_blk{is=Is},Live}. -live_opt_is([#b_set{op=phi,dst=Dst}=I|Is], Live, Acc) -> - case gb_sets:is_member(Dst, Live) of +live_opt_is([#b_set{op=phi,dst=Dst}=I|Is], Live0, Acc) -> + Live = cerl_sets:del_element(Dst, Live0), + case cerl_sets:is_element(Dst, Live0) of true -> live_opt_is(Is, Live, [I|Acc]); false -> @@ -1355,10 +1355,10 @@ live_opt_is([#b_set{op=phi,dst=Dst}=I|Is], Live, Acc) -> live_opt_is([#b_set{op={succeeded,guard},dst=SuccDst,args=[Dst]}=SuccI, #b_set{op=Op,dst=Dst}=I0|Is], Live0, Acc) -> - case {gb_sets:is_member(SuccDst, Live0), - gb_sets:is_member(Dst, Live0)} of + case {cerl_sets:is_element(SuccDst, Live0), + cerl_sets:is_element(Dst, Live0)} of {true, true} -> - Live = gb_sets:delete(SuccDst, Live0), + Live = cerl_sets:del_element(SuccDst, Live0), live_opt_is([I0|Is], Live, [SuccI|Acc]); {true, false} -> %% The result of the instruction before {succeeded,guard} is @@ -1378,8 +1378,8 @@ live_opt_is([#b_set{op={succeeded,guard},dst=SuccDst,args=[Dst]}=SuccI, I = I0#b_set{op=has_map_field,dst=SuccDst}, live_opt_is([I|Is], Live0, Acc); _ -> - Live1 = gb_sets:delete(SuccDst, Live0), - Live = gb_sets:add(Dst, Live1), + Live1 = cerl_sets:del_element(SuccDst, Live0), + Live = cerl_sets:add_element(Dst, Live1), live_opt_is([I0|Is], Live, [SuccI|Acc]) end; {false, true} -> @@ -1388,19 +1388,19 @@ live_opt_is([#b_set{op={succeeded,guard},dst=SuccDst,args=[Dst]}=SuccI, live_opt_is(Is, Live0, Acc) end; live_opt_is([#b_set{dst=Dst}=I|Is], Live0, Acc) -> - case gb_sets:is_member(Dst, Live0) of + case cerl_sets:is_element(Dst, Live0) of true -> - LiveUsed = gb_sets:from_ordset(beam_ssa:used(I)), - Live1 = gb_sets:union(Live0, LiveUsed), - Live = gb_sets:delete(Dst, Live1), + LiveUsed = cerl_sets:from_list(beam_ssa:used(I)), + Live1 = cerl_sets:union(Live0, LiveUsed), + Live = cerl_sets:del_element(Dst, Live1), live_opt_is(Is, Live, [I|Acc]); false -> case beam_ssa:no_side_effect(I) of true -> live_opt_is(Is, Live0, Acc); false -> - LiveUsed = gb_sets:from_ordset(beam_ssa:used(I)), - Live = gb_sets:union(Live0, LiveUsed), + LiveUsed = cerl_sets:from_list(beam_ssa:used(I)), + Live = cerl_sets:union(Live0, LiveUsed), live_opt_is(Is, Live, [I|Acc]) end end; -- 2.26.2
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor