Fixing write-barrier elimination; adding bb as a parameter to join-sets in dataflow analysis
parent
1a7ab59f56
commit
d35e1eb76c
|
@ -5,7 +5,7 @@ namespaces functors compiler.cfg.rpo compiler.cfg.utilities
|
||||||
compiler.cfg.predecessors compiler.cfg ;
|
compiler.cfg.predecessors compiler.cfg ;
|
||||||
IN: compiler.cfg.dataflow-analysis
|
IN: compiler.cfg.dataflow-analysis
|
||||||
|
|
||||||
GENERIC: join-sets ( sets dfa -- set )
|
GENERIC: join-sets ( sets bb dfa -- set )
|
||||||
GENERIC: transfer-set ( in-set bb dfa -- out-set )
|
GENERIC: transfer-set ( in-set bb dfa -- out-set )
|
||||||
GENERIC: block-order ( cfg dfa -- bbs )
|
GENERIC: block-order ( cfg dfa -- bbs )
|
||||||
GENERIC: successors ( bb dfa -- seq )
|
GENERIC: successors ( bb dfa -- seq )
|
||||||
|
@ -23,7 +23,7 @@ GENERIC# compute-in-set 2 ( bb out-sets dfa -- set )
|
||||||
M: kill-block compute-in-set 3drop f ;
|
M: kill-block compute-in-set 3drop f ;
|
||||||
|
|
||||||
M:: basic-block compute-in-set ( bb out-sets dfa -- set )
|
M:: basic-block compute-in-set ( bb out-sets dfa -- set )
|
||||||
bb dfa predecessors [ out-sets at ] map dfa join-sets ;
|
bb dfa predecessors [ out-sets at ] map bb dfa join-sets ;
|
||||||
|
|
||||||
:: update-in-set ( bb in-sets out-sets dfa -- ? )
|
:: update-in-set ( bb in-sets out-sets dfa -- ? )
|
||||||
bb out-sets dfa compute-in-set
|
bb out-sets dfa compute-in-set
|
||||||
|
@ -56,7 +56,7 @@ M:: basic-block compute-out-set ( bb in-sets dfa -- set )
|
||||||
in-sets
|
in-sets
|
||||||
out-sets ; inline
|
out-sets ; inline
|
||||||
|
|
||||||
M: dataflow-analysis join-sets drop assoc-refine ;
|
M: dataflow-analysis join-sets 2drop assoc-refine ;
|
||||||
|
|
||||||
FUNCTOR: define-analysis ( name -- )
|
FUNCTOR: define-analysis ( name -- )
|
||||||
|
|
||||||
|
|
|
@ -28,4 +28,4 @@ M: live-analysis transfer-set
|
||||||
drop instructions>> transfer-liveness ;
|
drop instructions>> transfer-liveness ;
|
||||||
|
|
||||||
M: live-analysis join-sets
|
M: live-analysis join-sets
|
||||||
drop assoc-combine ;
|
2drop assoc-combine ;
|
||||||
|
|
|
@ -21,7 +21,7 @@ BACKWARD-ANALYSIS: live
|
||||||
|
|
||||||
M: live-analysis transfer-set drop transfer-peeked-locs ;
|
M: live-analysis transfer-set drop transfer-peeked-locs ;
|
||||||
|
|
||||||
M: live-analysis join-sets drop assoc-combine ;
|
M: live-analysis join-sets 2drop assoc-combine ;
|
||||||
|
|
||||||
! A stack location is available at a location if all paths from
|
! A stack location is available at a location if all paths from
|
||||||
! the entry block to the location load the location into a
|
! the entry block to the location load the location into a
|
||||||
|
|
|
@ -65,7 +65,7 @@ M: uninitialized-analysis transfer-set ( pair bb analysis -- pair' )
|
||||||
drop [ prepare ] dip visit-block finish ;
|
drop [ prepare ] dip visit-block finish ;
|
||||||
|
|
||||||
M: uninitialized-analysis join-sets ( sets analysis -- pair )
|
M: uninitialized-analysis join-sets ( sets analysis -- pair )
|
||||||
drop sift [ f ] [ [ ] [ [ (join-sets) ] 2map ] map-reduce ] if-empty ;
|
2drop sift [ f ] [ [ ] [ [ (join-sets) ] 2map ] map-reduce ] if-empty ;
|
||||||
|
|
||||||
: uninitialized-locs ( bb -- locs )
|
: uninitialized-locs ( bb -- locs )
|
||||||
uninitialized-in dup [
|
uninitialized-in dup [
|
||||||
|
|
|
@ -36,11 +36,8 @@ FORWARD-ANALYSIS: safe
|
||||||
: has-allocation? ( bb -- ? )
|
: has-allocation? ( bb -- ? )
|
||||||
instructions>> [ { [ ##allocation? ] [ ##call? ] } 1|| ] any? ;
|
instructions>> [ { [ ##allocation? ] [ ##call? ] } 1|| ] any? ;
|
||||||
|
|
||||||
: (safe-in) ( maybe-safe-in bb -- safe-in )
|
|
||||||
has-allocation? not swap and [ H{ } clone ] unless* ;
|
|
||||||
|
|
||||||
M: safe-analysis transfer-set
|
M: safe-analysis transfer-set
|
||||||
drop [ (safe-in) ] keep
|
drop [ H{ } assoc-clone-like ] dip
|
||||||
instructions>> over '[
|
instructions>> over '[
|
||||||
dup ##write-barrier? [
|
dup ##write-barrier? [
|
||||||
src>> _ conjoin
|
src>> _ conjoin
|
||||||
|
@ -48,19 +45,13 @@ M: safe-analysis transfer-set
|
||||||
] each ;
|
] each ;
|
||||||
|
|
||||||
M: safe-analysis join-sets
|
M: safe-analysis join-sets
|
||||||
! maybe this would be better if we had access to the basic block
|
drop has-allocation? [ drop H{ } clone ] [ assoc-refine ] if ;
|
||||||
! then in this definition, it would check for has-allocation?
|
|
||||||
! (once rather than twice)
|
|
||||||
drop assoc-refine ;
|
|
||||||
|
|
||||||
: safe-start ( bb -- set )
|
|
||||||
[ safe-in ] keep (safe-in) ;
|
|
||||||
|
|
||||||
: write-barriers-step ( bb -- )
|
: write-barriers-step ( bb -- )
|
||||||
dup safe-start safe set
|
dup safe-in H{ } assoc-clone-like safe set
|
||||||
H{ } clone mutated set
|
H{ } clone mutated set
|
||||||
instructions>> [ eliminate-write-barrier ] filter-here ;
|
instructions>> [ eliminate-write-barrier ] filter-here ;
|
||||||
|
|
||||||
: eliminate-write-barriers ( cfg -- cfg' )
|
: eliminate-write-barriers ( cfg -- cfg' )
|
||||||
dup compute-safe-sets
|
dup compute-safe-sets
|
||||||
dup [ write-barriers-step ] each-basic-block ;
|
dup [ write-barriers-step ] each-basic-block ;
|
||||||
|
|
Loading…
Reference in New Issue