diff options
Diffstat (limited to 'lib/compiler/src/beam_trim.erl')
-rw-r--r-- | lib/compiler/src/beam_trim.erl | 17 |
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]); |