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
6155trim ([{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
124118trim_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
138131construct_recipes ([{kill ,{y ,Trim0 }}|Ks ], Trim0 , Moves , Acc ) ->
@@ -209,12 +202,12 @@ is_too_expensive_fun(false) ->
209202 end .
210203
211204is_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
237229remap ([{'%' ,Comment }= I0 |Is ], Remap ) ->
@@ -375,7 +367,7 @@ safe_labels([{label,L}|Is], Acc) ->
375367 end ;
376368safe_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
380372is_safe_label ([{'%' ,_ }|Is ]) ->
381373 is_safe_label (Is );
@@ -416,14 +408,14 @@ is_safe_label_block([]) -> true.
416408
417409frame_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) ->
448440do_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) ->
472464do_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 ;
483475do_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 ]);
489481do_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 ]);
493485do_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 ]);
513505do_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 ]);
517509do_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) ->
528520do_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 ;
552544do_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 ]);
557549do_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 ]);
563555do_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 ]);
569561do_usage ([{line ,_ }|Is ], Safe , Regs , Ns , Acc ) ->
570562 U = {Regs ,Ns },
571563 do_usage (Is , Safe , Regs , Ns , [U |Acc ]);
572564do_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 ]);
576568do_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 ]);
580572do_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) ->
589581do_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.
604596do_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 };
611603do_usage_blk ([], Regs , Ns ) -> {Regs ,Ns }.
612604
613605is_safe_branch ({f ,0 }, _Safe ) ->
614606 true ;
615607is_safe_branch ({f ,L }, Safe ) ->
616- is_element (L , Safe ).
608+ gb_sets : is_element (L , Safe ).
617609
618610yregs (Rs ) ->
619- from_list (yregs_1 (Rs )).
611+ gb_sets : from_list (yregs_1 (Rs )).
620612
621613yregs_1 ([{y ,_ }= Y |Rs ]) ->
622614 [Y |yregs_1 (Rs )];
0 commit comments