compiler.cfg.instructions compiler.cfg.registers fry kernel
locals namespaces sequences sets sorting math.vectors
make math combinators.short-circuit vectors ;
+FROM: namespaces => set ;
IN: compiler.cfg.dependence
! Dependence graph construction
node-number counter >>number
swap >>insn
H{ } clone >>precedes
- H{ } clone >>follows ;
+ V{ } clone >>follows ;
: ready? ( node -- ? ) precedes>> assoc-empty? ;
-: spin ( a b c -- c b a )
- [ 2nip ] [ drop nip ] [ 2drop ] 3tri ;
-
-: precedes ( first second how -- )
- spin precedes>> set-at ;
+:: precedes ( first second how -- )
+ how second first precedes>> set-at ;
:: add-data-edges ( nodes -- )
! This builds up def-use information on the fly, since
: set-follows ( nodes -- )
[
dup precedes>> keys [
- follows>> conjoin
+ follows>> push
] with each
] each ;
: set-roots ( nodes -- )
- [ ready? ] filter V{ } like roots set ;
+ [ ready? ] V{ } filter-as roots set ;
: build-dependence-graph ( instructions -- )
[ <node> ] map {
'[ _ >>parent-index drop ] each ;
: remove-node ( node -- )
- [ follows>> keys ] keep
+ [ follows>> members ] keep
'[ [ precedes>> _ swap check-delete-at ] each ]
[ [ ready? ] filter roots get push-all ] bi ;
ERROR: definition-after-usage vreg old-bb new-bb ;
:: check-usages ( new-bb old-bb -- )
- H{ } clone :> useds
+ HS{ } clone :> useds
new-bb instructions>> split-3-ways drop nip
[| insn |
- insn uses-vregs [ useds conjoin ] each
+ insn uses-vregs [ useds adjoin ] each
insn defs-vreg :> def-reg
- def-reg useds key?
+ def-reg useds in?
[ def-reg old-bb new-bb definition-after-usage ] when
] each ;
: schedule-instructions ( cfg -- cfg' )
dup [
- dup might-spill?
+ dup might-spill?
[ schedule-block ]
[ drop ] if
] each-basic-block ;