compiler.cfg.dcn.global: redo using compiler.cfg.dataflow-analysis
parent
b869e1250c
commit
b39b0dd393
|
@ -1,194 +1,39 @@
|
|||
! Copyright (C) 2009 Slava Pestov.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: accessors assocs deques dlists fry kernel namespaces sequences
|
||||
combinators combinators.short-circuit compiler.cfg.instructions
|
||||
compiler.cfg.dcn.local compiler.cfg.rpo compiler.cfg.utilities
|
||||
compiler.cfg ;
|
||||
USING: assocs kernel combinators compiler.cfg.dataflow-analysis
|
||||
compiler.cfg.dcn.local ;
|
||||
IN: compiler.cfg.dcn.global
|
||||
|
||||
<PRIVATE
|
||||
|
||||
: assoc-refine ( seq -- assoc )
|
||||
[ f ] [ [ ] [ assoc-intersect ] map-reduce ] if-empty ;
|
||||
|
||||
SYMBOL: work-list
|
||||
|
||||
: add-to-work-list ( basic-blocks -- )
|
||||
work-list get '[ _ push-front ] each ;
|
||||
|
||||
! Peek analysis. Peek-in is the set of all locations anticipated at
|
||||
! the start of a basic block.
|
||||
SYMBOLS: peek-ins peek-outs ;
|
||||
BACKWARD-ANALYSIS: peek
|
||||
|
||||
PRIVATE>
|
||||
|
||||
: peek-in ( bb -- assoc ) peek-ins get at ;
|
||||
: peek-out ( bb -- assoc ) peek-outs get at ;
|
||||
|
||||
<PRIVATE
|
||||
|
||||
GENERIC: compute-peek-in ( bb -- assoc )
|
||||
|
||||
M: basic-block compute-peek-in
|
||||
[ [ peek-out ] [ replace ] bi assoc-diff ] [ peek ] bi assoc-union ;
|
||||
|
||||
M: kill-block compute-peek-in drop f ;
|
||||
|
||||
: update-peek-in ( bb -- ? )
|
||||
[ compute-peek-in ] keep peek-ins get maybe-set-at ;
|
||||
|
||||
GENERIC: compute-peek-out ( bb -- assoc )
|
||||
|
||||
M: basic-block compute-peek-out
|
||||
successors>> peek-ins get '[ _ at ] map assoc-refine ;
|
||||
|
||||
M: kill-block compute-peek-out drop f ;
|
||||
|
||||
: update-peek-out ( bb -- ? )
|
||||
[ compute-peek-out ] keep peek-outs get maybe-set-at ;
|
||||
|
||||
: peek-step ( bb -- )
|
||||
dup update-peek-out [
|
||||
dup update-peek-in
|
||||
[ predecessors>> add-to-work-list ] [ drop ] if
|
||||
] [ drop ] if ;
|
||||
|
||||
: compute-peek-sets ( cfg -- )
|
||||
H{ } clone peek-ins set
|
||||
H{ } clone peek-outs set
|
||||
post-order add-to-work-list work-list get [ peek-step ] slurp-deque ;
|
||||
M: peek-analysis transfer-set drop [ replace assoc-diff ] keep peek assoc-union ;
|
||||
|
||||
! Replace analysis. Replace-in is the set of all locations which
|
||||
! will be overwritten at some point after the start of a basic block.
|
||||
SYMBOLS: replace-ins replace-outs ;
|
||||
FORWARD-ANALYSIS: replace
|
||||
|
||||
PRIVATE>
|
||||
|
||||
: replace-in ( bb -- assoc ) replace-ins get at ;
|
||||
: replace-out ( bb -- assoc ) replace-outs get at ;
|
||||
|
||||
<PRIVATE
|
||||
|
||||
GENERIC: compute-replace-in ( bb -- assoc )
|
||||
|
||||
M: basic-block compute-replace-in
|
||||
predecessors>> replace-outs get '[ _ at ] map assoc-refine ;
|
||||
|
||||
M: kill-block compute-replace-in drop f ;
|
||||
|
||||
: update-replace-in ( bb -- ? )
|
||||
[ compute-replace-in ] keep replace-ins get maybe-set-at ;
|
||||
|
||||
GENERIC: compute-replace-out ( bb -- assoc )
|
||||
|
||||
M: basic-block compute-replace-out
|
||||
[ replace-in ] [ replace ] bi assoc-union ;
|
||||
|
||||
M: kill-block compute-replace-out drop f ;
|
||||
|
||||
: update-replace-out ( bb -- ? )
|
||||
[ compute-replace-out ] keep replace-outs get maybe-set-at ;
|
||||
|
||||
: replace-step ( bb -- )
|
||||
dup update-replace-in [
|
||||
dup update-replace-out
|
||||
[ successors>> add-to-work-list ] [ drop ] if
|
||||
] [ drop ] if ;
|
||||
|
||||
: compute-replace-sets ( cfg -- )
|
||||
H{ } clone replace-ins set
|
||||
H{ } clone replace-outs set
|
||||
reverse-post-order add-to-work-list work-list get [ replace-step ] slurp-deque ;
|
||||
M: replace-analysis transfer-set drop replace assoc-union ;
|
||||
|
||||
! Availability analysis. Avail-out is the set of all locations
|
||||
! in registers at the end of a basic block.
|
||||
SYMBOLS: avail-ins avail-outs ;
|
||||
FORWARD-ANALYSIS: avail
|
||||
|
||||
PRIVATE>
|
||||
|
||||
: avail-in ( bb -- assoc ) avail-ins get at ;
|
||||
: avail-out ( bb -- assoc ) avail-outs get at ;
|
||||
|
||||
<PRIVATE
|
||||
|
||||
GENERIC: compute-avail-in ( bb -- assoc )
|
||||
|
||||
M: basic-block compute-avail-in
|
||||
predecessors>> avail-outs get '[ _ at ] map assoc-refine ;
|
||||
|
||||
M: kill-block compute-avail-in drop f ;
|
||||
|
||||
: update-avail-in ( bb -- ? )
|
||||
[ compute-avail-in ] keep avail-ins get maybe-set-at ;
|
||||
|
||||
GENERIC: compute-avail-out ( bb -- assoc )
|
||||
|
||||
M: basic-block compute-avail-out
|
||||
[ avail-in ] [ peek ] [ replace ] tri assoc-union assoc-union ;
|
||||
|
||||
M: kill-block compute-avail-out drop f ;
|
||||
|
||||
: update-avail-out ( bb -- ? )
|
||||
[ compute-avail-out ] keep avail-outs get maybe-set-at ;
|
||||
|
||||
: avail-step ( bb -- )
|
||||
dup update-avail-in [
|
||||
dup update-avail-out
|
||||
[ successors>> add-to-work-list ] [ drop ] if
|
||||
] [ drop ] if ;
|
||||
|
||||
: compute-avail-sets ( cfg -- )
|
||||
H{ } clone avail-ins set
|
||||
H{ } clone avail-outs set
|
||||
reverse-post-order add-to-work-list work-list get [ avail-step ] slurp-deque ;
|
||||
M: avail-analysis transfer-set drop [ peek ] [ replace ] bi assoc-union assoc-union ;
|
||||
|
||||
! Kill analysis. Kill-in is the set of all locations
|
||||
! which are going to be overwritten.
|
||||
SYMBOLS: kill-ins kill-outs ;
|
||||
BACKWARD-ANALYSIS: kill
|
||||
|
||||
PRIVATE>
|
||||
|
||||
: kill-in ( bb -- assoc ) kill-ins get at ;
|
||||
: kill-out ( bb -- assoc ) kill-outs get at ;
|
||||
|
||||
<PRIVATE
|
||||
|
||||
GENERIC: compute-kill-in ( bb -- assoc )
|
||||
|
||||
M: basic-block compute-kill-in
|
||||
[ kill-out ] [ replace ] bi assoc-union ;
|
||||
|
||||
M: kill-block compute-kill-in drop f ;
|
||||
|
||||
: update-kill-in ( bb -- ? )
|
||||
[ compute-kill-in ] keep kill-ins get maybe-set-at ;
|
||||
|
||||
GENERIC: compute-kill-out ( bb -- assoc )
|
||||
|
||||
M: basic-block compute-kill-out
|
||||
successors>> kill-ins get '[ _ at ] map assoc-refine ;
|
||||
|
||||
M: kill-block compute-kill-out drop f ;
|
||||
|
||||
: update-kill-out ( bb -- ? )
|
||||
[ compute-kill-out ] keep kill-outs get maybe-set-at ;
|
||||
|
||||
: kill-step ( bb -- )
|
||||
dup update-kill-out [
|
||||
dup update-kill-in
|
||||
[ predecessors>> add-to-work-list ] [ drop ] if
|
||||
] [ drop ] if ;
|
||||
|
||||
: compute-kill-sets ( cfg -- )
|
||||
H{ } clone kill-ins set
|
||||
H{ } clone kill-outs set
|
||||
post-order add-to-work-list work-list get [ kill-step ] slurp-deque ;
|
||||
M: kill-analysis transfer-set drop replace assoc-union ;
|
||||
|
||||
PRIVATE>
|
||||
|
||||
! Main word
|
||||
: compute-global-sets ( cfg -- )
|
||||
<hashed-dlist> work-list set
|
||||
{
|
||||
[ compute-peek-sets ]
|
||||
[ compute-replace-sets ]
|
||||
|
|
Loading…
Reference in New Issue