: visited? ( bb -- ? ) visited get in? ;
+: predecessors-ready? ( bb -- ? )
+ [ predecessors>> ] keep '[
+ _ 2dup back-edge?
+ [ 2drop t ] [ drop visited? ] if
+ ] all? ;
+
: (find-alternate-loop-head) ( bb -- bb' )
dup {
[ predecessor visited? not ]
nip (find-alternate-loop-head)
] if ;
-: predecessors-ready? ( bb -- ? )
- [ predecessors>> ] keep '[
- _ 2dup back-edge?
- [ 2drop t ] [ drop visited? ] if
- ] all? ;
-
: sorted-successors ( bb -- seq )
successors>> <reversed> [ loop-nesting-at ] sort-with ;
dup visited get ?adjoin [ dup , sorted-successors ] [ drop { } ] if
[ predecessors-ready? ] filter
[ dup loop-entry? [ find-alternate-loop-head ] when ] map
- [ visited? not ] filter ;
+ [ visited? ] reject ;
: (linearization-order) ( cfg -- bbs )
HS{ } clone visited set
entry>> <dlist> [ push-back ] keep
- [ [ process-block ] slurp/replenish-deque ] { } make ;
+ [ dup '[ process-block _ push-all-back ] slurp-deque ] { } make ;
PRIVATE>