compiler.cfg.coalescing: more or less complete, now needs debugging
parent
a32cbdd231
commit
ba696b68b8
|
@ -1,8 +1,9 @@
|
|||
! Copyright (C) 2009 Slava Pestov.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: accessors assocs fry kernel locals math math.order
|
||||
sequences
|
||||
sequences namespaces sets
|
||||
compiler.cfg.rpo
|
||||
compiler.cfg.def-use
|
||||
compiler.cfg.utilities
|
||||
compiler.cfg.dominance
|
||||
compiler.cfg.instructions
|
||||
|
@ -21,7 +22,24 @@ IN: compiler.cfg.coalescing
|
|||
: process-blocks ( cfg -- )
|
||||
[ [ process-block ] if-has-phis ] each-basic-block ;
|
||||
|
||||
: break-interferences ( -- ) ;
|
||||
SYMBOL: seen
|
||||
|
||||
:: visit-renaming ( dst assoc src bb -- )
|
||||
src seen get key? [
|
||||
src dst bb waiting-for push-at
|
||||
src assoc delete-at
|
||||
] [ src seen get conjoin ] if ;
|
||||
|
||||
:: break-interferences ( -- )
|
||||
V{ } clone seen set
|
||||
renaming-sets get [| dst assoc |
|
||||
assoc [| src bb |
|
||||
src seen get key?
|
||||
[ dst assoc src bb visit-renaming ]
|
||||
[ src seen get conjoin ]
|
||||
if
|
||||
] assoc-each
|
||||
] assoc-each ;
|
||||
|
||||
: remove-phis-from-block ( bb -- )
|
||||
instructions>> [ ##phi? not ] filter-here ;
|
||||
|
@ -31,9 +49,11 @@ IN: compiler.cfg.coalescing
|
|||
|
||||
: coalesce ( cfg -- cfg' )
|
||||
init-coalescing
|
||||
dup compute-def-use
|
||||
dup compute-dominance
|
||||
dup compute-dfs
|
||||
dup process-blocks
|
||||
break-interferences
|
||||
dup insert-copies
|
||||
perform-renaming
|
||||
dup perform-renaming
|
||||
dup remove-phis ;
|
|
@ -1,39 +1,21 @@
|
|||
! Copyright (C) 2009 Slava Pestov.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: accessors assocs combinators fry kernel namespaces sequences
|
||||
compiler.cfg.def-use compiler.cfg.dominance compiler.cfg.instructions
|
||||
compiler.cfg.renaming ;
|
||||
USING: accessors assocs hashtables fry kernel make namespaces
|
||||
sequences compiler.cfg.coalescing.state compiler.cfg.parallel-copy ;
|
||||
IN: compiler.cfg.coalescing.copies
|
||||
|
||||
SYMBOLS: stacks visited pushed ;
|
||||
|
||||
: compute-renaming ( insn -- assoc )
|
||||
uses-vregs stacks get
|
||||
'[ dup dup _ at [ nip last ] unless-empty ]
|
||||
H{ } map>assoc ;
|
||||
|
||||
: rename-operands ( bb -- )
|
||||
instructions>> [
|
||||
dup ##phi? [ drop ] [
|
||||
dup compute-renaming renamings set
|
||||
[ rename-insn-uses ] [ rename-insn-defs ] bi
|
||||
] if
|
||||
] each ;
|
||||
|
||||
: schedule-copies ( bb -- )
|
||||
! FIXME
|
||||
drop ;
|
||||
|
||||
: pop-stacks ( -- )
|
||||
pushed get stacks get '[ drop _ at pop* ] assoc-each ;
|
||||
|
||||
: (insert-copies) ( bb -- )
|
||||
H{ } clone pushed [
|
||||
[ rename-operands ]
|
||||
[ schedule-copies ]
|
||||
[ dom-children [ (insert-copies) ] each ] tri
|
||||
pop-stacks
|
||||
] with-variable ;
|
||||
: compute-copies ( assoc -- assoc' )
|
||||
dup assoc-size <hashtable> [
|
||||
'[
|
||||
[ _ set-at ] with each
|
||||
] assoc-each
|
||||
] keep ;
|
||||
|
||||
: insert-copies ( cfg -- )
|
||||
entry>> (insert-copies) ;
|
||||
waiting get [
|
||||
[ instructions>> building ] dip '[
|
||||
building get pop
|
||||
_ compute-copies parallel-copy
|
||||
,
|
||||
] with-variable
|
||||
] assoc-each ;
|
|
@ -1,10 +1,33 @@
|
|||
! Copyright (C) 2009 Slava Pestov.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: kernel ;
|
||||
USING: accessors assocs fry kernel namespaces sequences
|
||||
compiler.cfg.coalescing.state compiler.cfg.renaming compiler.cfg.rpo
|
||||
disjoint-sets ;
|
||||
IN: compiler.cfg.coalescing.renaming
|
||||
|
||||
: perform-renaming ( -- )
|
||||
renaming-sets get [
|
||||
! XXX
|
||||
2drop
|
||||
] assoc-each ;
|
||||
: update-congruence-class ( dst assoc disjoint-set -- )
|
||||
[ keys swap ] dip
|
||||
[ nip add-atoms ]
|
||||
[ add-atom drop ]
|
||||
[ equate-all-with ] 3tri ;
|
||||
|
||||
: build-congruence-classes ( -- disjoint-set )
|
||||
renaming-sets get
|
||||
<disjoint-set> [
|
||||
'[
|
||||
_ update-congruence-class
|
||||
] assoc-each
|
||||
] keep ;
|
||||
|
||||
: compute-renaming ( disjoint-set -- assoc )
|
||||
[ parents>> ] keep
|
||||
'[ drop dup _ representative ] assoc-map ;
|
||||
|
||||
: perform-renaming ( cfg -- )
|
||||
build-congruence-classes compute-renaming renamings set
|
||||
[
|
||||
instructions>> [
|
||||
[ rename-insn-defs ]
|
||||
[ rename-insn-uses ] bi
|
||||
] each
|
||||
] each-basic-block ;
|
||||
|
|
|
@ -60,21 +60,26 @@ PRIVATE>
|
|||
[ '[ 2dup eq? [ 2drop ] [ _ push-at ] if ] assoc-each ] keep
|
||||
dom-childrens set ;
|
||||
|
||||
! Maps bb -> DF(bb)
|
||||
SYMBOL: dom-frontiers
|
||||
|
||||
PRIVATE>
|
||||
|
||||
: dom-frontier ( bb -- set ) dom-frontiers get at keys ;
|
||||
: compute-dominance ( cfg -- )
|
||||
compute-dom-parents compute-dom-children ;
|
||||
|
||||
<PRIVATE
|
||||
|
||||
! Maps bb -> DF(bb)
|
||||
SYMBOL: dom-frontiers
|
||||
|
||||
: compute-dom-frontier ( bb pred -- )
|
||||
2dup [ dom-parent ] dip eq? [ 2drop ] [
|
||||
[ dom-frontiers get conjoin-at ]
|
||||
[ dom-parent compute-dom-frontier ] 2bi
|
||||
] if ;
|
||||
|
||||
PRIVATE>
|
||||
|
||||
: dom-frontier ( bb -- set ) dom-frontiers get at keys ;
|
||||
|
||||
: compute-dom-frontiers ( cfg -- )
|
||||
H{ } clone dom-frontiers set
|
||||
[
|
||||
|
@ -83,13 +88,6 @@ PRIVATE>
|
|||
] [ 2drop ] if
|
||||
] each-basic-block ;
|
||||
|
||||
PRIVATE>
|
||||
|
||||
: compute-dominance ( cfg -- )
|
||||
[ compute-dom-parents compute-dom-children ]
|
||||
[ compute-dom-frontiers ]
|
||||
bi ;
|
||||
|
||||
<PRIVATE
|
||||
|
||||
SYMBOLS: work-list visited ;
|
||||
|
|
|
@ -11,7 +11,7 @@ compiler.cfg.value-numbering
|
|||
compiler.cfg.copy-prop
|
||||
compiler.cfg.dce
|
||||
compiler.cfg.write-barrier
|
||||
compiler.cfg.phi-elimination
|
||||
compiler.cfg.coalescing
|
||||
compiler.cfg.empty-blocks
|
||||
compiler.cfg.predecessors
|
||||
compiler.cfg.rpo
|
||||
|
@ -32,7 +32,7 @@ SYMBOL: check-optimizer?
|
|||
optimize-tail-calls
|
||||
delete-useless-conditionals
|
||||
compute-predecessors
|
||||
split-branches
|
||||
! split-branches
|
||||
join-blocks
|
||||
compute-predecessors
|
||||
construct-ssa
|
||||
|
@ -42,7 +42,7 @@ SYMBOL: check-optimizer?
|
|||
copy-propagation
|
||||
eliminate-dead-code
|
||||
eliminate-write-barriers
|
||||
eliminate-phis
|
||||
coalesce
|
||||
delete-empty-blocks
|
||||
?check
|
||||
] with-scope ;
|
||||
|
|
|
@ -113,6 +113,7 @@ PRIVATE>
|
|||
[ ]
|
||||
[ compute-live-sets ]
|
||||
[ compute-dominance ]
|
||||
[ compute-dom-frontiers ]
|
||||
[ compute-defs compute-phi-nodes insert-phi-nodes ]
|
||||
[ rename ]
|
||||
} cleave ;
|
|
@ -35,6 +35,8 @@ TUPLE: disjoint-set
|
|||
: representative? ( a disjoint-set -- ? )
|
||||
dupd parent = ; inline
|
||||
|
||||
PRIVATE>
|
||||
|
||||
GENERIC: representative ( a disjoint-set -- p )
|
||||
|
||||
M: disjoint-set representative
|
||||
|
@ -42,6 +44,8 @@ M: disjoint-set representative
|
|||
[ [ parent ] keep representative dup ] 2keep set-parent
|
||||
] if ;
|
||||
|
||||
<PRIVATE
|
||||
|
||||
: representatives ( a b disjoint-set -- r r )
|
||||
[ representative ] curry bi@ ; inline
|
||||
|
||||
|
|
Loading…
Reference in New Issue