diff options
author | Björn Gustavsson <bjorn@erlang.org> | 2020-01-31 06:35:03 +0100 |
---|---|---|
committer | Björn Gustavsson <bjorn@erlang.org> | 2020-02-05 09:42:30 +0100 |
commit | 8c23c30b6851f54c6f2245d12ccba4c3dec193e4 (patch) | |
tree | 2cc19d05d3032a89d7aeeb0a8780b1311e67d45f /lib/compiler/src/beam_ssa_dead.erl | |
parent | eb8248b2a129becdeb215815fc91b10942c3a995 (diff) | |
download | erlang-8c23c30b6851f54c6f2245d12ccba4c3dec193e4.tar.gz |
beam_ssa_dead: Eliminate Bs argument that is always an empty map
Diffstat (limited to 'lib/compiler/src/beam_ssa_dead.erl')
-rw-r--r-- | lib/compiler/src/beam_ssa_dead.erl | 51 |
1 files changed, 24 insertions, 27 deletions
diff --git a/lib/compiler/src/beam_ssa_dead.erl b/lib/compiler/src/beam_ssa_dead.erl index e7ff8eb48f..1719166b59 100644 --- a/lib/compiler/src/beam_ssa_dead.erl +++ b/lib/compiler/src/beam_ssa_dead.erl @@ -97,38 +97,38 @@ shortcut_opt(#st{bs=Blocks}=St) -> %% in the first clause of shortcut_2/5). Ls = beam_ssa:rpo(Blocks), - shortcut_opt(Ls, #{}, St). + shortcut_opt(Ls, St). -shortcut_opt([L|Ls], Bs, #st{bs=Blocks0}=St) -> +shortcut_opt([L|Ls], #st{bs=Blocks0}=St) -> #b_blk{is=Is,last=Last0} = Blk0 = get_block(L, St), - case shortcut_terminator(Last0, Is, L, Bs, St) of + case shortcut_terminator(Last0, Is, L, St) of Last0 -> %% No change. No need to update the block. - shortcut_opt(Ls, Bs, St); + shortcut_opt(Ls, St); Last -> %% The terminator was simplified in some way. %% Update the block. Blk = Blk0#b_blk{last=Last}, Blocks = Blocks0#{L=>Blk}, - shortcut_opt(Ls, Bs, St#st{bs=Blocks}) + shortcut_opt(Ls, St#st{bs=Blocks}) end; -shortcut_opt([], _, St) -> St. +shortcut_opt([], St) -> St. shortcut_terminator(#b_br{bool=#b_literal{val=true},succ=Succ0}, - _Is, From, Bs, St0) -> + _Is, From, St0) -> St = St0#st{rel_op=none}, - shortcut(Succ0, From, Bs, St); + shortcut(Succ0, From, #{}, St); shortcut_terminator(#b_br{bool=#b_var{}=Bool,succ=Succ0,fail=Fail0}=Br, - Is, From, Bs, St0) -> + Is, From, St0) -> St = St0#st{target=one_way}, RelOp = get_rel_op(Bool, Is), %% The boolean in a `br` is seldom used by the successors. By %% not binding its value unless it is actually used we might be able %% to skip some work in shortcut/4 and sub/2. - SuccBs = bind_var_if_used(Succ0, Bool, #b_literal{val=true}, Bs, St), + SuccBs = bind_var_if_used(Succ0, Bool, #b_literal{val=true}, St), BrSucc = shortcut(Succ0, From, SuccBs, St#st{rel_op=RelOp}), - FailBs = bind_var_if_used(Fail0, Bool, #b_literal{val=false}, Bs, St), + FailBs = bind_var_if_used(Fail0, Bool, #b_literal{val=false}, St), BrFail = shortcut(Fail0, From, FailBs, St#st{rel_op=invert_op(RelOp)}), case {BrSucc,BrFail} of @@ -142,33 +142,33 @@ shortcut_terminator(#b_br{bool=#b_var{}=Bool,succ=Succ0,fail=Fail0}=Br, Br end; shortcut_terminator(#b_switch{arg=Bool,fail=Fail0,list=List0}=Sw, - _Is, From, Bs, St) -> - Fail = shortcut_sw_fail(Fail0, List0, Bool, From, Bs, St), - List = shortcut_sw_list(List0, Bool, From, Bs, St), + _Is, From, St) -> + Fail = shortcut_sw_fail(Fail0, List0, Bool, From, St), + List = shortcut_sw_list(List0, Bool, From, St), beam_ssa:normalize(Sw#b_switch{fail=Fail,list=List}); -shortcut_terminator(Last, _Is, _Bs, _From, _St) -> +shortcut_terminator(Last, _Is, _From, _St) -> Last. -shortcut_sw_fail(Fail0, List, Bool, From, Bs, St0) -> +shortcut_sw_fail(Fail0, List, Bool, From, St0) -> case sort(List) of [{#b_literal{val=false},_}, {#b_literal{val=true},_}] -> RelOp = {{'not',is_boolean},Bool}, St = St0#st{rel_op=RelOp,target=one_way}, #b_br{bool=#b_literal{val=true},succ=Fail} = - shortcut(Fail0, From, Bs, St), + shortcut(Fail0, From, #{}, St), Fail; _ -> Fail0 end. -shortcut_sw_list([{Lit,L0}|T], Bool, From, Bs, St0) -> +shortcut_sw_list([{Lit,L0}|T], Bool, From, St0) -> RelOp = {'=:=',Bool,Lit}, St = St0#st{rel_op=RelOp}, #b_br{bool=#b_literal{val=true},succ=L} = - shortcut(L0, From, bind_var(Bool, Lit, Bs), St#st{target=one_way}), - [{Lit,L}|shortcut_sw_list(T, Bool, From, Bs, St0)]; -shortcut_sw_list([], _, _, _, _) -> []. + shortcut(L0, From, bind_var(Bool, Lit, #{}), St#st{target=one_way}), + [{Lit,L}|shortcut_sw_list(T, Bool, From, St0)]; +shortcut_sw_list([], _, _, _) -> []. shortcut(L, _From, Bs, #st{rel_op=none,target=one_way}) when map_size(Bs) =:= 0 -> %% There is no way that we can find a suitable branch, because there is no @@ -549,13 +549,10 @@ eval_switch_1([], _Arg, _PrevOp, Fail) -> %% Fail is now either the failure label or 'none'. Fail. -bind_var_if_used(L, Var, Val0, Bs, #st{us=Us}) -> +bind_var_if_used(L, Var, Val, #st{us=Us}) -> case cerl_sets:is_element(Var, map_get(L, Us)) of - true -> - Val = get_value(Val0, Bs), - Bs#{Var=>Val}; - false -> - Bs + true -> #{Var=>Val}; + false -> #{} end. bind_var(Var, failed, Bs) -> |