compiler.cfg.scheduling: update to support multiple-output instructions

db4
Slava Pestov 2010-07-15 17:38:34 -04:00
parent 5e13318988
commit 48e96ef032
4 changed files with 66 additions and 38 deletions

View File

@ -24,7 +24,7 @@ TUPLE: node
children parent children parent
registers parent-index ; registers parent-index ;
M: node equal? [ number>> ] bi@ = ; M: node equal? over node? [ [ number>> ] bi@ = ] [ 2drop f ] if ;
M: node hashcode* nip number>> ; M: node hashcode* nip number>> ;
@ -56,12 +56,9 @@ UNION: slot-insn
UNION: memory-insn UNION: memory-insn
##load-memory ##load-memory-imm ##load-memory ##load-memory-imm
##store-memory ##store-memory-imm ; ##store-memory ##store-memory-imm
alien-call-insn
UNION: alien-call-insn slot-insn ;
##save-context
##alien-invoke ##alien-indirect ##alien-callback
##unary-float-function ##binary-float-function ;
: chain ( node var -- ) : chain ( node var -- )
dup get [ dup get [
@ -71,24 +68,14 @@ UNION: alien-call-insn
GENERIC: add-control-edge ( node insn -- ) GENERIC: add-control-edge ( node insn -- )
M: stack-insn add-control-edge M: stack-insn add-control-edge loc>> chain ;
loc>> chain ;
M: memory-insn add-control-edge M: memory-insn add-control-edge drop memory-insn chain ;
drop memory-insn chain ;
M: slot-insn add-control-edge
drop slot-insn chain ;
M: alien-call-insn add-control-edge
drop alien-call-insn chain ;
M: object add-control-edge 2drop ; M: object add-control-edge 2drop ;
: add-control-edges ( nodes -- ) : add-control-edges ( nodes -- )
[ [ [ dup insn>> add-control-edge ] each ] with-scope ;
[ dup insn>> add-control-edge ] each
] with-scope ;
: set-follows ( nodes -- ) : set-follows ( nodes -- )
[ [

View File

@ -1,15 +1,15 @@
! Copyright (C) 2010 Slava Pestov. ! Copyright (C) 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: kernel compiler.cfg.gc-checks USING: kernel compiler.cfg.representations
compiler.cfg.representations compiler.cfg.save-contexts compiler.cfg.scheduling compiler.cfg.gc-checks
compiler.cfg.ssa.destruction compiler.cfg.build-stack-frame compiler.cfg.save-contexts compiler.cfg.ssa.destruction
compiler.cfg.linear-scan compiler.cfg.build-stack-frame compiler.cfg.linear-scan
compiler.cfg.stacks.uninitialized ; compiler.cfg.stacks.uninitialized ;
IN: compiler.cfg.finalization IN: compiler.cfg.finalization
: finalize-cfg ( cfg -- cfg' ) : finalize-cfg ( cfg -- cfg' )
select-representations select-representations
! schedule-instructions schedule-instructions
insert-gc-checks insert-gc-checks
dup compute-uninitialized-sets dup compute-uninitialized-sets
insert-save-contexts insert-save-contexts

View File

@ -1,4 +1,5 @@
USING: compiler.cfg.scheduling vocabs.loader namespaces tools.test ; USING: compiler.cfg.scheduling compiler.cfg.instructions
vocabs.loader namespaces tools.test arrays kernel ;
IN: compiler.cfg.scheduling.tests IN: compiler.cfg.scheduling.tests
! Recompile compiler.cfg.scheduling with extra tests, ! Recompile compiler.cfg.scheduling with extra tests,
@ -9,3 +10,31 @@ t check-scheduling? [
[ ] [ "compiler.cfg.scheduling" reload ] unit-test [ ] [ "compiler.cfg.scheduling" reload ] unit-test
[ ] [ "compiler.cfg.dependence" reload ] unit-test [ ] [ "compiler.cfg.dependence" reload ] unit-test
] with-variable ] with-variable
[
{ }
{ }
{ T{ ##test-branch } }
] [
V{ T{ ##test-branch } }
split-3-ways
[ >array ] tri@
] unit-test
[
{ T{ ##inc-d } T{ ##inc-r } T{ ##callback-inputs } }
{ T{ ##add } T{ ##sub } T{ ##mul } }
{ T{ ##test-branch } }
] [
V{
T{ ##inc-d }
T{ ##inc-r }
T{ ##callback-inputs }
T{ ##add }
T{ ##sub }
T{ ##mul }
T{ ##test-branch }
}
split-3-ways
[ >array ] tri@
] unit-test

View File

@ -52,21 +52,33 @@ ERROR: bad-delete-at key assoc ;
, (reorder) , (reorder)
] when* ; ] when* ;
: cut-by ( seq quot -- before after ) UNION: initial-insn ##phi ##inc-d ##inc-r ##callback-inputs ;
dupd find drop [ cut ] [ f ] if* ; inline
UNION: initial-insn UNION: final-insn
##phi ##inc-d ##inc-r ; ##branch
conditional-branch-insn
##epilogue ##return
##callback-outputs ;
: split-3-ways ( insns -- first middle last ) : initial-insn-end ( insns -- n )
[ initial-insn? not ] cut-by unclip-last ; [ initial-insn? not ] find drop 0 or ;
: final-insn-start ( insns -- n )
[ final-insn? not ] find-last drop [ 1 + ] [ 0 ] if* ;
:: split-3-ways ( insns -- first middle last )
insns initial-insn-end :> a
insns final-insn-start :> b
insns a head-slice
a b insns <slice>
insns b tail-slice ;
: reorder ( insns -- insns' ) : reorder ( insns -- insns' )
split-3-ways [ split-3-ways [
build-dependence-graph build-dependence-graph
build-fan-in-trees build-fan-in-trees
[ (reorder) ] V{ } make reverse [ (reorder) ] V{ } make reverse
] dip suffix append ; ] dip 3append ;
ERROR: not-all-instructions-were-scheduled old-bb new-bb ; ERROR: not-all-instructions-were-scheduled old-bb new-bb ;
@ -78,16 +90,16 @@ f check-scheduling? set-global
[ [ length ] bi@ = ] [ [ unique ] bi@ = ] 2bi and [ [ length ] bi@ = ] [ [ unique ] bi@ = ] 2bi and
[ old-bb new-bb not-all-instructions-were-scheduled ] unless ; [ old-bb new-bb not-all-instructions-were-scheduled ] unless ;
ERROR: definition-after-usage vreg old-bb new-bb ; ERROR: definition-after-usage vregs old-bb new-bb ;
:: check-usages ( new-bb old-bb -- ) :: check-usages ( new-bb old-bb -- )
HS{ } clone :> useds HS{ } clone :> useds
new-bb instructions>> split-3-ways drop nip new-bb instructions>> split-3-ways drop nip
[| insn | [| insn |
insn uses-vregs [ useds adjoin ] each insn uses-vregs [ useds adjoin ] each
insn defs-vreg :> def-reg insn defs-vregs :> defs-vregs
def-reg useds in? defs-vregs useds intersects?
[ def-reg old-bb new-bb definition-after-usage ] when [ defs-vregs old-bb new-bb definition-after-usage ] when
] each ; ] each ;
: check-scheduling ( new-bb old-bb -- ) : check-scheduling ( new-bb old-bb -- )
@ -124,7 +136,7 @@ ERROR: definition-after-usage vreg old-bb new-bb ;
: might-spill? ( bb -- ? ) : might-spill? ( bb -- ? )
[ live-in assoc-size ] [ live-in assoc-size ]
[ instructions>> [ defs-vreg ] count ] bi [ instructions>> [ defs-vregs length ] map-sum ] bi
+ num-registers >= ; + num-registers >= ;
: schedule-instructions ( cfg -- cfg' ) : schedule-instructions ( cfg -- cfg' )