aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2016-04-06 06:29:49 +0200
committerBjörn Gustavsson <[email protected]>2016-04-11 13:57:26 +0200
commit8a659704161705fb838447cb6aa54627e12a8910 (patch)
tree349511b0921b58ceb9189fd03cf2808493622a23 /lib
parent9d2dde09689246cd61a5e7bfdc8ca37884043a9c (diff)
downloadotp-8a659704161705fb838447cb6aa54627e12a8910.tar.gz
otp-8a659704161705fb838447cb6aa54627e12a8910.tar.bz2
otp-8a659704161705fb838447cb6aa54627e12a8910.zip
beam_peep: Help out beam_jump
beam_jump fails to optimize the following: jump 2 label 1 label 2 Since this situation is rare, instead of complicating beam_jump, add the optimization to beam_peep. It will always succeed, since adjacent labels have been coalesced.
Diffstat (limited to 'lib')
-rw-r--r--lib/compiler/src/beam_peep.erl3
1 files changed, 3 insertions, 0 deletions
diff --git a/lib/compiler/src/beam_peep.erl b/lib/compiler/src/beam_peep.erl
index 0c1abfe6a0..5a02626642 100644
--- a/lib/compiler/src/beam_peep.erl
+++ b/lib/compiler/src/beam_peep.erl
@@ -83,6 +83,9 @@ peep([{gc_bif,_,_,_,_,Dst}=I|Is], SeenTests0, Acc) ->
%% Kill all remembered tests that depend on the destination register.
SeenTests = kill_seen(Dst, SeenTests0),
peep(Is, SeenTests, [I|Acc]);
+peep([{jump,{f,L}},{label,L}=I|Is], _, Acc) ->
+ %% Sometimes beam_jump has missed this optimization.
+ peep(Is, gb_sets:empty(), [I|Acc]);
peep([{select,Op,R,F,Vls0}|Is], _, Acc) ->
case prune_redundant_values(Vls0, F) of
[] ->