aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjörn Gustavsson <[email protected]>2016-12-09 12:17:26 +0100
committerBjörn Gustavsson <[email protected]>2016-12-09 14:31:59 +0100
commitebdf6e688c68b95e0c0b6f9b00b9f9c26f83525e (patch)
treefa3b38db53732a625ad88e66b9fe990581bd21f1
parentb29787dbcc53b4ab1b5bfedd1ad45708d0f99dc1 (diff)
downloadotp-ebdf6e688c68b95e0c0b6f9b00b9f9c26f83525e.tar.gz
otp-ebdf6e688c68b95e0c0b6f9b00b9f9c26f83525e.tar.bz2
otp-ebdf6e688c68b95e0c0b6f9b00b9f9c26f83525e.zip
beam_type: Minimize number of regs in test_heap instructions
The beam_type may pass move and recalculates test_heap instructions. The number of live registers are not always the lowest. Minimize the number of registers by running beam_utils:live_opt/1 one more time.
-rw-r--r--lib/compiler/src/beam_type.erl3
-rw-r--r--lib/compiler/src/beam_utils.erl2
2 files changed, 4 insertions, 1 deletions
diff --git a/lib/compiler/src/beam_type.erl b/lib/compiler/src/beam_type.erl
index d324580cba..9866dcd070 100644
--- a/lib/compiler/src/beam_type.erl
+++ b/lib/compiler/src/beam_type.erl
@@ -34,7 +34,8 @@ function({function,Name,Arity,CLabel,Asm0}) ->
try
Asm1 = beam_utils:live_opt(Asm0),
Asm2 = opt(Asm1, [], tdb_new()),
- Asm = beam_utils:delete_live_annos(Asm2),
+ Asm3 = beam_utils:live_opt(Asm2),
+ Asm = beam_utils:delete_live_annos(Asm3),
{function,Name,Arity,CLabel,Asm}
catch
Class:Error ->
diff --git a/lib/compiler/src/beam_utils.erl b/lib/compiler/src/beam_utils.erl
index 74e3d7e38a..ffeff9ea81 100644
--- a/lib/compiler/src/beam_utils.erl
+++ b/lib/compiler/src/beam_utils.erl
@@ -768,6 +768,8 @@ live_opt_block([{set,Ds,Ss,Op}=I0|Is], Regs0, D, Acc) ->
_ ->
live_opt_block(Is, Regs, D, [I|Acc])
end;
+live_opt_block([{'%live',_,_}|Is], Regs, D, Acc) ->
+ live_opt_block(Is, Regs, D, Acc);
live_opt_block([], Regs, _, Acc) -> {Acc,Regs}.
live_join_labels([{f,L}|T], D, Regs0) when L =/= 0 ->