compiler.cfg.dependence/scheduling: refactoring, trying to get rid of the ugly usage of nodes dynamic variable
parent
0a7726b66d
commit
2cfd55b864
|
@ -84,13 +84,12 @@ M: object add-control-edge 2drop ;
|
|||
: set-roots ( nodes -- )
|
||||
[ ready? ] V{ } filter-as roots set ;
|
||||
|
||||
: build-dependence-graph ( instructions -- )
|
||||
[ <node> ] map {
|
||||
: build-dependence-graph ( nodes -- )
|
||||
{
|
||||
[ add-control-edges ]
|
||||
[ add-data-edges ]
|
||||
[ set-follows ]
|
||||
[ set-roots ]
|
||||
[ nodes set ]
|
||||
} cleave ;
|
||||
|
||||
! Sethi-Ulmann numbering
|
||||
|
@ -121,8 +120,7 @@ M: object add-control-edge 2drop ;
|
|||
] if-empty
|
||||
] [ drop ] if ;
|
||||
|
||||
: make-trees ( -- trees )
|
||||
nodes get
|
||||
: make-trees ( nodes -- trees )
|
||||
[ [ choose-parent ] each ]
|
||||
[ [ parent>> not ] filter ] bi ;
|
||||
|
||||
|
@ -146,8 +144,8 @@ ERROR: node-missing-children trees nodes ;
|
|||
: verify-trees ( trees -- trees )
|
||||
verify-parents verify-children ;
|
||||
|
||||
: build-fan-in-trees ( -- )
|
||||
make-trees verify-trees [
|
||||
: build-fan-in-trees ( nodes -- )
|
||||
dup nodes set make-trees verify-trees [
|
||||
-1/0. >>parent-index
|
||||
calculate-registers drop
|
||||
] each ;
|
||||
|
|
|
@ -1,10 +1,6 @@
|
|||
USING: compiler.cfg compiler.cfg.height help.markup help.syntax sequences ;
|
||||
IN: compiler.cfg.scheduling
|
||||
|
||||
HELP: number-insns
|
||||
{ $values { "insns" sequence } }
|
||||
{ $description "Assigns a sequence number to the " { $slot "insn#" } " slot of each instruction in the sequence." } ;
|
||||
|
||||
HELP: schedule-instructions
|
||||
{ $values { "cfg" cfg } { "cfg'" cfg } }
|
||||
{ $description "Performs a instruction scheduling optimization pass over the CFG to attempt to reduce the number of spills. The step must be performed after " { $link normalize-height } " or else invalid peeks might be inserted into the CFG." } ;
|
||||
|
|
|
@ -66,15 +66,21 @@ conditional-branch-insn
|
|||
: final-insn-start ( insns -- n )
|
||||
[ final-insn? not ] find-last drop [ 1 + ] [ 0 ] if* ;
|
||||
|
||||
! hack to get bootstrapping working
|
||||
: split-indices-int ( seq indices -- pieces )
|
||||
over length suffix 0 swap [ dup swapd 2array ] map nip
|
||||
[ first2 rot subseq ] with map ;
|
||||
|
||||
: split-insns ( insns -- pre/body/post )
|
||||
dup [ initial-insn-end ] [ final-insn-start ] bi 2array split-indices ;
|
||||
dup [ initial-insn-end ] [ final-insn-start ] bi 2array split-indices-int ;
|
||||
|
||||
: reorder-body ( body -- body' )
|
||||
[ <node> ] map
|
||||
[ build-dependence-graph ] [ build-fan-in-trees ] bi
|
||||
[ (reorder) ] V{ } make reverse ;
|
||||
|
||||
: reorder ( insns -- insns' )
|
||||
split-insns first3 [
|
||||
build-dependence-graph
|
||||
build-fan-in-trees
|
||||
[ (reorder) ] V{ } make reverse
|
||||
] dip 3append ;
|
||||
split-insns first3 [ reorder-body ] dip 3append ;
|
||||
|
||||
: schedule-block ( bb -- )
|
||||
[ reorder ] change-instructions drop ;
|
||||
|
|
Loading…
Reference in New Issue