Skip to content

Commit dbbb219

Browse files
committed
revert unnecessary changes and leverage gb_sets
1 parent d03275e commit dbbb219

File tree

1 file changed

+64
-72
lines changed

1 file changed

+64
-72
lines changed

lib/compiler/src/beam_trim.erl

Lines changed: 64 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,12 @@
2424
-moduledoc false.
2525
-export([module/2]).
2626

27-
-import(lists, [any/2,reverse/2,seq/2,sort/1,last/1]).
28-
-import(sets, [from_list/1,intersection/2,is_disjoint/2,is_element/2,is_subset/2,union/2,subtract/2,del_element/2,to_list/1]).
27+
-import(lists, [any/2,merge/1,reverse/2,seq/2,sort/1]).
2928

3029
-include("beam_asm.hrl").
3130

3231
-record(st,
33-
{safe :: sets:set(beam_asm:label()), %Safe labels.
32+
{safe :: gb_sets:set(beam_asm:label()), %Safe labels.
3433
fsz :: non_neg_integer()
3534
}).
3635

@@ -41,21 +40,16 @@ module({Mod,Exp,Attr,Fs0,Lc}, _Opts) ->
4140
Fs = [function(F) || F <- Fs0],
4241
{ok,{Mod,Exp,Attr,Fs,Lc}}.
4342

44-
function({function,Name,Arity,CLabel,Is0}=F) ->
45-
case length(Is0) of
46-
N when N < 50 ->
47-
F;
48-
_ ->
49-
try
50-
St = #st{safe=safe_labels(Is0, []),fsz=0},
51-
Usage = none,
52-
Is = trim(Is0, Usage, St),
53-
{function,Name,Arity,CLabel,Is}
54-
catch
55-
Class:Error:Stack ->
56-
io:fwrite("Function: ~w/~w\n", [Name,Arity]),
57-
erlang:raise(Class, Error, Stack)
58-
end
43+
function({function,Name,Arity,CLabel,Is0}) ->
44+
try
45+
St = #st{safe=safe_labels(Is0, []),fsz=0},
46+
Usage = none,
47+
Is = trim(Is0, Usage, St),
48+
{function,Name,Arity,CLabel,Is}
49+
catch
50+
Class:Error:Stack ->
51+
io:fwrite("Function: ~w/~w\n", [Name,Arity]),
52+
erlang:raise(Class, Error, Stack)
5953
end.
6054

6155
trim([{init_yregs,_}=I|Is], none, St0) ->
@@ -122,7 +116,7 @@ is_not_recursive(_) -> false.
122116
%% Y registers. Return the recipe that trims the most.
123117

124118
trim_recipe(Layout, IsNotRecursive, {Us,Ns}) ->
125-
UsedRegs = union(Us, Ns),
119+
UsedRegs = gb_sets:union(Us, Ns),
126120
Recipes = construct_recipes(Layout, 0, [], []),
127121
NumOrigKills = length([I || {kill,_}=I <- Layout]),
128122
IsTooExpensive = is_too_expensive_fun(IsNotRecursive),
@@ -131,8 +125,7 @@ trim_recipe(Layout, IsNotRecursive, {Us,Ns}) ->
131125
not is_too_expensive(R, NumOrigKills, IsTooExpensive)],
132126
case Rs of
133127
[] -> none;
134-
[R] -> R;
135-
[_|_] -> last(Rs)
128+
[R|_] -> R
136129
end.
137130

138131
construct_recipes([{kill,{y,Trim0}}|Ks], Trim0, Moves, Acc) ->
@@ -209,12 +202,12 @@ is_too_expensive_fun(false) ->
209202
end.
210203

211204
is_recipe_viable({_,Trim,Moves}, UsedRegs) ->
212-
Moved = from_list([Src || {move,Src,_} <- Moves]),
213-
Illegal = from_list([Dst || {move,_,Dst} <- Moves]),
205+
Moved = gb_sets:from_list([Src || {move,Src,_} <- Moves]),
206+
Illegal = gb_sets:from_list([Dst || {move,_,Dst} <- Moves]),
214207
Eliminated = [{y,N} || N <- seq(0, Trim - 1)],
215208
%% All eliminated registers that are also in the used set must be moved.
216-
UsedEliminated = intersection(from_list(Eliminated), UsedRegs),
217-
case is_subset(UsedEliminated, Moved) andalso is_disjoint(Illegal, UsedRegs) of
209+
UsedEliminated = gb_sets:intersection(gb_sets:from_list(Eliminated), UsedRegs),
210+
case gb_sets:is_subset(UsedEliminated, Moved) andalso gb_sets:is_disjoint(Illegal, UsedRegs) of
218211
true ->
219212
UsedEliminated = Moved, %Assertion.
220213
true;
@@ -230,8 +223,7 @@ expand_recipe({Layout,Trim,Moves}, FrameSize) ->
230223
[] ->
231224
{Is,Remap};
232225
[_|_]=Yregs ->
233-
SortedYregs = lists:sort(Yregs),
234-
{[{init_yregs,{list,SortedYregs}}|Is],Remap}
226+
{[{init_yregs,{list,Yregs}}|Is],Remap}
235227
end.
236228

237229
remap([{'%',Comment}=I0|Is], Remap) ->
@@ -375,7 +367,7 @@ safe_labels([{label,L}|Is], Acc) ->
375367
end;
376368
safe_labels([_|Is], Acc) ->
377369
safe_labels(Is, Acc);
378-
safe_labels([], Acc) -> from_list(Acc).
370+
safe_labels([], Acc) -> gb_sets:from_list(Acc).
379371

380372
is_safe_label([{'%',_}|Is]) ->
381373
is_safe_label(Is);
@@ -416,14 +408,14 @@ is_safe_label_block([]) -> true.
416408

417409
frame_layout(N, Killed, {U,_}) ->
418410
AllRegisters = [{y,R} || R <- seq(0, N - 1)],
419-
LiveOrKilledSet = union(U, from_list(Killed)),
420-
DeadSet = subtract(from_list(AllRegisters), LiveOrKilledSet),
421-
UsedRegs = to_list(U),
422-
Dead = to_list(DeadSet),
411+
LiveOrKilledSet = gb_sets:union(U, gb_sets:from_list(Killed)),
412+
DeadSet = gb_sets:subtract(gb_sets:from_list(AllRegisters), LiveOrKilledSet),
413+
UsedRegs = gb_sets:to_list(U),
414+
Dead = gb_sets:to_list(DeadSet),
423415
Is = [[{R,{live,R}} || R <- UsedRegs],
424416
[{R,{dead,R}} || R <- Dead],
425417
[{R,{kill,R}} || R <- Killed]],
426-
[I || {_,I} <:- lists:merge(Is)].
418+
[I || {_,I} <:- merge(Is)].
427419

428420
%% usage([Instruction], SafeLabels) -> {FrameSize,[UsedYRegs]}
429421
%% Find out the frame size and usage information by looking at the
@@ -448,8 +440,8 @@ usage_1([], Acc) ->
448440
do_usage(Is0, #st{safe=Safe}) ->
449441
case Is0 of
450442
[return,{deallocate,N}|Is] ->
451-
Regs = sets:new(),
452-
Ns = sets:new(),
443+
Regs = gb_sets:new(),
444+
Ns = gb_sets:new(),
453445
case do_usage(Is, Safe, Regs, Ns, []) of
454446
none ->
455447
none;
@@ -472,30 +464,30 @@ do_usage([{block,Blk}|Is], Safe, Regs0, Ns0, Acc) ->
472464
do_usage([{bs_create_bin,Fail,_,_,_,Dst,{list,Args}}|Is], Safe, Regs0, Ns0, Acc) ->
473465
case is_safe_branch(Fail, Safe) of
474466
true ->
475-
Regs1 = del_element(Dst, Regs0),
476-
Regs = union(Regs1, yregs(Args)),
477-
Ns = union(yregs([Dst]), Ns0),
467+
Regs1 = gb_sets:del_element(Dst, Regs0),
468+
Regs = gb_sets:union(Regs1, yregs(Args)),
469+
Ns = gb_sets:union(yregs([Dst]), Ns0),
478470
U = {Regs,Ns},
479471
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
480472
false ->
481473
none
482474
end;
483475
do_usage([{bs_get_tail,Src,Dst,_}|Is], Safe, Regs0, Ns0, Acc) ->
484-
Regs1 = del_element(Dst, Regs0),
485-
Regs = union(Regs1, yregs([Src])),
486-
Ns = union(yregs([Dst]), Ns0),
476+
Regs1 = gb_sets:del_element(Dst, Regs0),
477+
Regs = gb_sets:union(Regs1, yregs([Src])),
478+
Ns = gb_sets:union(yregs([Dst]), Ns0),
487479
U = {Regs,Ns},
488480
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
489481
do_usage([{bs_set_position,Src1,Src2}|Is], Safe, Regs0, Ns, Acc) ->
490-
Regs = union(Regs0, yregs([Src1,Src2])),
482+
Regs = gb_sets:union(Regs0, yregs([Src1,Src2])),
491483
U = {Regs,Ns},
492484
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
493485
do_usage([{bs_start_match4,Fail,_Live,Src,Dst}|Is], Safe, Regs0, Ns, Acc) ->
494486
case (Fail =:= {atom,no_fail} orelse
495487
Fail =:= {atom,resume} orelse
496488
is_safe_branch(Fail, Safe)) of
497489
true ->
498-
Regs = union(Regs0, yregs([Src,Dst])),
490+
Regs = gb_sets:union(Regs0, yregs([Src,Dst])),
499491
U = {Regs,Ns},
500492
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
501493
false ->
@@ -511,15 +503,15 @@ do_usage([{call_fun,_}|Is], Safe, Regs, Ns, Acc) ->
511503
U = {Regs,Ns},
512504
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
513505
do_usage([{call_fun2,_,_,Ss}|Is], Safe, Regs0, Ns, Acc) ->
514-
Regs = union(Regs0, yregs([Ss])),
506+
Regs = gb_sets:union(Regs0, yregs([Ss])),
515507
U = {Regs,Ns},
516508
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
517509
do_usage([{bif,_,Fail,Ss,Dst}|Is], Safe, Regs0, Ns0, Acc) ->
518510
case is_safe_branch(Fail, Safe) of
519511
true ->
520-
Regs1 = del_element(Dst, Regs0),
521-
Regs = union(Regs1, yregs(Ss)),
522-
Ns = union(yregs([Dst]), Ns0),
512+
Regs1 = gb_sets:del_element(Dst, Regs0),
513+
Regs = gb_sets:union(Regs1, yregs(Ss)),
514+
Ns = gb_sets:union(yregs([Dst]), Ns0),
523515
U = {Regs,Ns},
524516
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
525517
false ->
@@ -528,9 +520,9 @@ do_usage([{bif,_,Fail,Ss,Dst}|Is], Safe, Regs0, Ns0, Acc) ->
528520
do_usage([{gc_bif,_,Fail,_,Ss,Dst}|Is], Safe, Regs0, Ns0, Acc) ->
529521
case is_safe_branch(Fail, Safe) of
530522
true ->
531-
Regs1 = del_element(Dst, Regs0),
532-
Regs = union(Regs1, yregs(Ss)),
533-
Ns = union(yregs([Dst]), Ns0),
523+
Regs1 = gb_sets:del_element(Dst, Regs0),
524+
Regs = gb_sets:union(Regs1, yregs(Ss)),
525+
Ns = gb_sets:union(yregs([Dst]), Ns0),
534526
U = {Regs,Ns},
535527
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
536528
false ->
@@ -541,46 +533,46 @@ do_usage([{get_map_elements,Fail,S,{list,List}}|Is], Safe, Regs0, Ns0, Acc) ->
541533
true ->
542534
{Ss,Ds1} = beam_utils:split_even(List),
543535
Ds = yregs(Ds1),
544-
Regs1 = subtract(Regs0, Ds),
545-
Regs = union(Regs1, yregs([S|Ss])),
546-
Ns = union(Ns0, Ds),
536+
Regs1 = gb_sets:subtract(Regs0, Ds),
537+
Regs = gb_sets:union(Regs1, yregs([S|Ss])),
538+
Ns = gb_sets:union(Ns0, Ds),
547539
U = {Regs,Ns},
548540
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
549541
false ->
550542
none
551543
end;
552544
do_usage([{init_yregs,{list,Ds}}|Is], Safe, Regs0, Ns0, Acc) ->
553-
Regs = subtract(Regs0, yregs(Ds)),
554-
Ns = union(Ns0, from_list(Ds)),
545+
Regs = gb_sets:subtract(Regs0, yregs(Ds)),
546+
Ns = gb_sets:union(Ns0, gb_sets:from_list(Ds)),
555547
U = {Regs,Ns},
556548
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
557549
do_usage([{make_fun3,_,_,_,Dst,{list,Ss}}|Is], Safe, Regs0, Ns0, Acc) ->
558-
Regs1 = del_element(Dst, Regs0),
559-
Regs = union(Regs1, yregs(Ss)),
560-
Ns = union(yregs([Dst]), Ns0),
550+
Regs1 = gb_sets:del_element(Dst, Regs0),
551+
Regs = gb_sets:union(Regs1, yregs(Ss)),
552+
Ns = gb_sets:union(yregs([Dst]), Ns0),
561553
U = {Regs,Ns},
562554
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
563555
do_usage([{update_record,_,_,Src,Dst,{list,Ss}}|Is], Safe, Regs0, Ns0, Acc) ->
564-
Regs1 = del_element(Dst, Regs0),
565-
Regs = union(Regs1, yregs([Src|Ss])),
566-
Ns = union(yregs([Dst]), Ns0),
556+
Regs1 = gb_sets:del_element(Dst, Regs0),
557+
Regs = gb_sets:union(Regs1, yregs([Src|Ss])),
558+
Ns = gb_sets:union(yregs([Dst]), Ns0),
567559
U = {Regs,Ns},
568560
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
569561
do_usage([{line,_}|Is], Safe, Regs, Ns, Acc) ->
570562
U = {Regs,Ns},
571563
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
572564
do_usage([{recv_marker_clear,Src}|Is], Safe, Regs0, Ns, Acc) ->
573-
Regs = union(Regs0, yregs([Src])),
565+
Regs = gb_sets:union(Regs0, yregs([Src])),
574566
U = {Regs,Ns},
575567
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
576568
do_usage([{recv_marker_reserve,Src}|Is], Safe, Regs0, Ns, Acc) ->
577-
Regs = union(Regs0, yregs([Src])),
569+
Regs = gb_sets:union(Regs0, yregs([Src])),
578570
U = {Regs,Ns},
579571
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
580572
do_usage([{test,_,Fail,Ss}|Is], Safe, Regs0, Ns, Acc) ->
581573
case is_safe_branch(Fail, Safe) of
582574
true ->
583-
Regs = union(Regs0, yregs(Ss)),
575+
Regs = gb_sets:union(Regs0, yregs(Ss)),
584576
U = {Regs,Ns},
585577
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
586578
false ->
@@ -589,9 +581,9 @@ do_usage([{test,_,Fail,Ss}|Is], Safe, Regs0, Ns, Acc) ->
589581
do_usage([{test,_,Fail,_,Ss,Dst}|Is], Safe, Regs0, Ns0, Acc) ->
590582
case is_safe_branch(Fail, Safe) of
591583
true ->
592-
Regs1 = del_element(Dst, Regs0),
593-
Regs = union(Regs1, yregs(Ss)),
594-
Ns = union(yregs([Dst]), Ns0),
584+
Regs1 = gb_sets:del_element(Dst, Regs0),
585+
Regs = gb_sets:union(Regs1, yregs(Ss)),
586+
Ns = gb_sets:union(yregs([Dst]), Ns0),
595587
U = {Regs,Ns},
596588
do_usage(Is, Safe, Regs, Ns, [U|Acc]);
597589
false ->
@@ -604,19 +596,19 @@ do_usage([], _Safe, _Regs, _Ns, Acc) -> Acc.
604596
do_usage_blk([{set,Ds0,Ss,_}|Is], Regs0, Ns0) ->
605597
Ds = yregs(Ds0),
606598
{Regs1,Ns1} = do_usage_blk(Is, Regs0, Ns0),
607-
Regs2 = subtract(Regs1, Ds),
608-
Regs = union(Regs2, yregs(Ss)),
609-
Ns = union(Ns1, Ds),
599+
Regs2 = gb_sets:subtract(Regs1, Ds),
600+
Regs = gb_sets:union(Regs2, yregs(Ss)),
601+
Ns = gb_sets:union(Ns1, Ds),
610602
{Regs,Ns};
611603
do_usage_blk([], Regs, Ns) -> {Regs,Ns}.
612604

613605
is_safe_branch({f,0}, _Safe) ->
614606
true;
615607
is_safe_branch({f,L}, Safe) ->
616-
is_element(L, Safe).
608+
gb_sets:is_element(L, Safe).
617609

618610
yregs(Rs) ->
619-
from_list(yregs_1(Rs)).
611+
gb_sets:from_list(yregs_1(Rs)).
620612

621613
yregs_1([{y,_}=Y|Rs]) ->
622614
[Y|yregs_1(Rs)];

0 commit comments

Comments
 (0)