aboutsummaryrefslogtreecommitdiffstats
path: root/lib/compiler/src/beam_jump.erl
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2018-10-24 11:42:47 +0200
committerGitHub <[email protected]>2018-10-24 11:42:47 +0200
commit6ec47f51582af516f864f7ff30cd51794723f390 (patch)
tree1f5092eff59550b72f0f8ea7283c54d4481c5fcc /lib/compiler/src/beam_jump.erl
parent87015bf28b7e144fa0de78fa423a1c09e395b1f5 (diff)
parent58d6a866dae481a098ea583439cac3fbb95df787 (diff)
downloadotp-6ec47f51582af516f864f7ff30cd51794723f390.tar.gz
otp-6ec47f51582af516f864f7ff30cd51794723f390.tar.bz2
otp-6ec47f51582af516f864f7ff30cd51794723f390.zip
Merge pull request #1994 from bjorng/bjorn/compiler/beam_jump
Make the move elimination optimization in beam_jump safe
Diffstat (limited to 'lib/compiler/src/beam_jump.erl')
-rw-r--r--lib/compiler/src/beam_jump.erl13
1 files changed, 5 insertions, 8 deletions
diff --git a/lib/compiler/src/beam_jump.erl b/lib/compiler/src/beam_jump.erl
index fbff4cfd79..d694bd2a5b 100644
--- a/lib/compiler/src/beam_jump.erl
+++ b/lib/compiler/src/beam_jump.erl
@@ -196,22 +196,19 @@ no_fallthrough([I|_]) ->
is_unreachable_after(I).
already_has_value(Lit, Lbl, Reg, D) ->
- Key = {Lbl,Reg},
case D of
- #{Lbl:=unsafe} ->
- false;
- #{Key:=Lit} ->
+ #{Lbl:={Reg,Lit}} ->
true;
#{} ->
false
end.
update_value_dict([Lit,{f,Lbl}|T], Reg, D0) ->
- Key = {Lbl,Reg},
D = case D0 of
- #{Key := inconsistent} -> D0;
- #{Key := _} -> D0#{Key := inconsistent};
- _ -> D0#{Key => Lit}
+ #{Lbl:=unsafe} -> D0;
+ #{Lbl:={Reg,Lit}} -> D0;
+ #{Lbl:=_} -> D0#{Lbl:=unsafe};
+ #{} -> D0#{Lbl=>{Reg,Lit}}
end,
update_value_dict(T, Reg, D);
update_value_dict([], _, D) -> D.