compiler.cfg.stack-analysis: global optimization work in progress

db4
Slava Pestov 2009-07-16 16:43:14 -05:00
parent fc0e0f1924
commit 685e32b091
3 changed files with 11 additions and 38 deletions

View File

@ -92,6 +92,7 @@ SYMBOL: added-phis
:: multiple-predecessors ( bb states -- state ) :: multiple-predecessors ( bb states -- state )
states [ not ] any? [ states [ not ] any? [
<state> <state>
bb add-to-work-list
] [ ] [
[ [
H{ } clone added-instructions set H{ } clone added-instructions set

View File

@ -14,9 +14,7 @@ compiler.cfg.stack-analysis.merge
compiler.cfg.utilities ; compiler.cfg.utilities ;
IN: compiler.cfg.stack-analysis IN: compiler.cfg.stack-analysis
SYMBOL: work-list SYMBOL: global-optimization?
: add-to-work-list ( bb -- ) work-list get push-front ;
: redundant-replace? ( vreg loc -- ? ) : redundant-replace? ( vreg loc -- ? )
dup state get untranslate-loc n>> 0 < dup state get untranslate-loc n>> 0 <
@ -70,7 +68,8 @@ UNION: sync-if-back-edge
[ [ predecessors>> ] keep '[ _ back-edge? ] any? ] any? ; [ [ predecessors>> ] keep '[ _ back-edge? ] any? ] any? ;
M: sync-if-back-edge visit M: sync-if-back-edge visit
sync-state? [ sync-state ] when , ; global-optimization? get [ sync-state? [ sync-state ] when ] unless
, ;
: eliminate-peek ( dst src -- ) : eliminate-peek ( dst src -- )
! the requested stack location is already in 'src' ! the requested stack location is already in 'src'
@ -87,31 +86,8 @@ M: ##replace visit
M: ##copy visit M: ##copy visit
[ call-next-method ] [ record-copy ] bi ; [ call-next-method ] [ record-copy ] bi ;
! Instructions that poison the stack state
UNION: poison-insn
##jump
##return
##callback-return
##fixnum-mul-tail
##fixnum-add-tail
##fixnum-sub-tail ;
M: poison-insn visit call-next-method poison-state ; M: poison-insn visit call-next-method poison-state ;
! Instructions that kill all live vregs
UNION: kill-vreg-insn
poison-insn
##stack-frame
##call
##prologue
##epilogue
##fixnum-mul
##fixnum-add
##fixnum-sub
##alien-invoke
##alien-indirect
##alien-callback ;
M: kill-vreg-insn visit sync-state , ; M: kill-vreg-insn visit sync-state , ;
! Maps basic-blocks to states ! Maps basic-blocks to states
@ -142,21 +118,13 @@ SYMBOLS: state-in state-out ;
] 2bi ] 2bi
] V{ } make >>instructions drop ; ] V{ } make >>instructions drop ;
: visit-successors ( bb -- )
dup successors>> [
2dup back-edge? [ 2drop ] [ nip add-to-work-list ] if
] with each ;
: process-work-list ( -- )
work-list get [ visit-block ] slurp-deque ;
: stack-analysis ( cfg -- cfg' ) : stack-analysis ( cfg -- cfg' )
[ [
<hashed-dlist> work-list set <hashed-dlist> work-list set
H{ } clone copies set H{ } clone copies set
H{ } clone state-in set H{ } clone state-in set
H{ } clone state-out set H{ } clone state-out set
dup [ add-to-work-list ] each-basic-block dup [ visit-block ] each-basic-block
process-work-list global-optimization? get [ work-list get [ visit-block ] slurp-deque ] when
cfg-changed cfg-changed
] with-scope ; ] with-scope ;

View File

@ -1,6 +1,6 @@
! Copyright (C) 2009 Slava Pestov. ! Copyright (C) 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: kernel accessors namespaces assocs sets math USING: kernel accessors namespaces assocs sets math deques
compiler.cfg.registers ; compiler.cfg.registers ;
IN: compiler.cfg.stack-analysis.state IN: compiler.cfg.stack-analysis.state
@ -47,3 +47,7 @@ M: rs-loc translate-loc [ n>> ] [ rs-height>> ] bi* - <rs-loc> ;
GENERIC# untranslate-loc 1 ( loc state -- loc' ) GENERIC# untranslate-loc 1 ( loc state -- loc' )
M: ds-loc untranslate-loc [ n>> ] [ ds-height>> ] bi* + <ds-loc> ; M: ds-loc untranslate-loc [ n>> ] [ ds-height>> ] bi* + <ds-loc> ;
M: rs-loc untranslate-loc [ n>> ] [ rs-height>> ] bi* + <rs-loc> ; M: rs-loc untranslate-loc [ n>> ] [ rs-height>> ] bi* + <rs-loc> ;
SYMBOL: work-list
: add-to-work-list ( bb -- ) work-list get push-front ;