summaryrefslogtreecommitdiff
path: root/lib/compiler/src/beam_trim.erl
diff options
context:
space:
mode:
Diffstat (limited to 'lib/compiler/src/beam_trim.erl')
-rw-r--r--lib/compiler/src/beam_trim.erl17
1 files changed, 14 insertions, 3 deletions
diff --git a/lib/compiler/src/beam_trim.erl b/lib/compiler/src/beam_trim.erl
index 4fb141251d..b5ff21bbac 100644
--- a/lib/compiler/src/beam_trim.erl
+++ b/lib/compiler/src/beam_trim.erl
@@ -1,7 +1,7 @@
%%
%% %CopyrightBegin%
%%
-%% Copyright Ericsson AB 2007-2022. All Rights Reserved.
+%% Copyright Ericsson AB 2007-2023. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
@@ -212,8 +212,7 @@ is_recipe_viable({_,Trim,Moves}, UsedRegs) ->
expand_recipe({Layout,Trim,Moves}, FrameSize) ->
Is = reverse(Moves, [{trim,Trim,FrameSize-Trim}]),
- Map0 = [{Src,Dst-Trim} || {move,{y,Src},{y,Dst}} <- Moves],
- Map = maps:from_list(Map0),
+ Map = #{Src => Dst - Trim || {move,{y,Src},{y,Dst}} <- Moves},
Remap = {Trim,Map},
case [Y || {kill,Y} <- Layout] of
[] ->
@@ -278,6 +277,12 @@ remap([{make_fun3,F,Index,OldUniq,Dst0,{list,Env0}}|Is], Remap) ->
Dst = remap_arg(Dst0, Remap),
I = {make_fun3,F,Index,OldUniq,Dst,{list,Env}},
[I|remap(Is, Remap)];
+remap([{update_record,Hint,Size,Src0,Dst0,{list,Updates0}}|Is], Remap) ->
+ Updates = remap_args(Updates0, Remap),
+ Src = remap_arg(Src0, Remap),
+ Dst = remap_arg(Dst0, Remap),
+ I = {update_record,Hint,Size,Src,Dst,{list,Updates}},
+ [I|remap(Is, Remap)];
remap([{deallocate,N}|Is], {Trim,_}=Remap) ->
I = {deallocate,N-Trim},
[I|remap(Is, Remap)];
@@ -527,6 +532,12 @@ do_usage([{make_fun3,_,_,_,Dst,{list,Ss}}|Is], Safe, Regs0, Ns0, Acc) ->
Ns = ordsets:union(yregs([Dst]), Ns0),
U = {Regs,Ns},
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
+do_usage([{update_record,_,_,Src,Dst,{list,Ss}}|Is], Safe, Regs0, Ns0, Acc) ->
+ Regs1 = ordsets:del_element(Dst, Regs0),
+ Regs = ordsets:union(Regs1, yregs([Src|Ss])),
+ Ns = ordsets:union(yregs([Dst]), Ns0),
+ U = {Regs,Ns},
+ do_usage(Is, Safe, Regs, Ns, [U|Acc]);
do_usage([{line,_}|Is], Safe, Regs, Ns, Acc) ->
U = {Regs,Ns},
do_usage(Is, Safe, Regs, Ns, [U|Acc]);