compiler.cfg.dcn: Fixing various bugs, hook up with optimizer

db4
Slava Pestov 2009-07-21 22:24:50 -05:00
parent cfb584ed8d
commit e49de006c4
5 changed files with 232 additions and 99 deletions

View File

@ -1,12 +1,14 @@
IN: compiler.cfg.dcn.tests IN: compiler.cfg.dcn.tests
USING: tools.test kernel accessors namespaces assocs USING: tools.test kernel accessors namespaces assocs math
cpu.architecture vectors sequences cpu.architecture vectors sequences classes
compiler.cfg compiler.cfg
compiler.cfg.utilities compiler.cfg.utilities
compiler.cfg.debugger compiler.cfg.debugger
compiler.cfg.registers compiler.cfg.registers
compiler.cfg.predecessors compiler.cfg.predecessors
compiler.cfg.instructions compiler.cfg.instructions
compiler.cfg.checker
compiler.cfg.dcn
compiler.cfg.dcn.height compiler.cfg.dcn.height
compiler.cfg.dcn.local compiler.cfg.dcn.local
compiler.cfg.dcn.local.private compiler.cfg.dcn.local.private
@ -19,12 +21,19 @@ compiler.cfg.dcn.rewrite ;
[ local-analysis ] keep [ local-analysis ] keep
instructions>> ; instructions>> ;
: inserting-peeks' ( from to -- assoc )
[ inserting-peeks ] keep untranslate-locs keys ;
: inserting-replaces' ( from to -- assoc )
[ inserting-replaces ] keep untranslate-locs remove-dead-stores keys ;
[ [
V{ V{
T{ ##copy f V int-regs 1 V int-regs 0 } T{ ##copy f V int-regs 1 V int-regs 0 }
T{ ##copy f V int-regs 3 V int-regs 2 } T{ ##copy f V int-regs 3 V int-regs 2 }
T{ ##copy f V int-regs 5 V int-regs 4 } T{ ##copy f V int-regs 5 V int-regs 4 }
T{ ##inc-d f -1 } T{ ##inc-d f -1 }
T{ ##branch }
} }
] [ ] [
V{ V{
@ -38,6 +47,7 @@ compiler.cfg.dcn.rewrite ;
T{ ##peek f V int-regs 5 D 1 } T{ ##peek f V int-regs 5 D 1 }
T{ ##replace f V int-regs 5 D 1 } T{ ##replace f V int-regs 5 D 1 }
T{ ##replace f V int-regs 6 D -1 } T{ ##replace f V int-regs 6 D -1 }
T{ ##branch }
} test-local-dcn } test-local-dcn
] unit-test ] unit-test
@ -68,11 +78,10 @@ compiler.cfg.dcn.rewrite ;
: test-global-dcn ( -- ) : test-global-dcn ( -- )
cfg new 0 get >>entry cfg new 0 get >>entry
compute-predecessors compute-predecessors
[ compute-heights ] deconcatenatize
[ compute-local-sets ] check-cfg ;
[ compute-global-sets ] tri ;
V{ T{ ##return } } 0 test-bb V{ T{ ##epilogue } T{ ##return } } 0 test-bb
[ ] [ test-global-dcn ] unit-test [ ] [ test-global-dcn ] unit-test
@ -84,7 +93,9 @@ V{
V{ V{
T{ ##inc-d f 1 } T{ ##inc-d f 1 }
T{ ##peek f V int-regs 0 D 1 } T{ ##peek f V int-regs 0 D 1 }
T{ ##load-immediate f V int-regs 1 100 }
T{ ##replace f V int-regs 1 D 2 } T{ ##replace f V int-regs 1 D 2 }
T{ ##branch }
} 1 test-bb } 1 test-bb
V{ V{
@ -108,13 +119,13 @@ V{
[ f ] [ D 0 0 get avail-out key? ] unit-test [ f ] [ D 0 0 get avail-out key? ] unit-test
[ { D 0 } ] [ 0 get 1 get inserting-peeks keys ] unit-test [ { D 0 } ] [ 0 get 1 get inserting-peeks' ] unit-test
[ { } ] [ 1 get 2 get inserting-peeks keys ] unit-test [ { } ] [ 1 get 2 get inserting-peeks' ] unit-test
[ { } ] [ 0 get 1 get inserting-replaces keys ] unit-test [ { } ] [ 0 get 1 get inserting-replaces' ] unit-test
[ { D 2 } ] [ 1 get 2 get inserting-replaces keys ] unit-test [ { D 2 } ] [ 1 get 2 get inserting-replaces' ] unit-test
V{ V{
T{ ##prologue } T{ ##prologue }
@ -123,21 +134,29 @@ V{
V{ V{
T{ ##peek f V int-regs 0 D 1 } T{ ##peek f V int-regs 0 D 1 }
T{ ##branch }
} 1 test-bb } 1 test-bb
V{ V{
T{ ##inc-d f -1 } T{ ##inc-d f -1 }
T{ ##peek f V int-regs 0 D 0 } T{ ##peek f V int-regs 0 D 0 }
T{ ##branch }
} 2 test-bb } 2 test-bb
V{
T{ ##epilogue }
T{ ##return }
} 3 test-bb
0 get 1 get 1vector >>successors drop 0 get 1 get 1vector >>successors drop
1 get 2 get 1vector >>successors drop 1 get 2 get 1vector >>successors drop
2 get 3 get 1vector >>successors drop
[ ] [ test-global-dcn ] unit-test [ ] [ test-global-dcn ] unit-test
[ t ] [ D 1 2 get peek-in key? ] unit-test [ t ] [ D 1 2 get peek-in key? ] unit-test
[ { D 1 } ] [ 0 get 1 get inserting-peeks keys ] unit-test [ { D 1 } ] [ 0 get 1 get inserting-peeks' ] unit-test
[ { } ] [ 1 get 2 get inserting-peeks keys ] unit-test [ { } ] [ 1 get 2 get inserting-peeks' ] unit-test
V{ V{
T{ ##prologue } T{ ##prologue }
@ -184,16 +203,16 @@ V{
[ t ] [ D 0 4 get peek-in key? ] unit-test [ t ] [ D 0 4 get peek-in key? ] unit-test
[ t ] [ D 1 4 get peek-in key? ] unit-test [ t ] [ D 1 4 get peek-in key? ] unit-test
[ { D 0 } ] [ 0 get 1 get inserting-peeks keys ] unit-test [ { D 0 } ] [ 0 get 1 get inserting-peeks' ] unit-test
[ { } ] [ 0 get 1 get inserting-replaces keys ] unit-test [ { } ] [ 0 get 1 get inserting-replaces' ] unit-test
[ { } ] [ 1 get 2 get inserting-peeks keys ] unit-test [ { } ] [ 1 get 2 get inserting-peeks' ] unit-test
[ { } ] [ 1 get 2 get inserting-replaces keys ] unit-test [ { } ] [ 1 get 2 get inserting-replaces' ] unit-test
[ { } ] [ 1 get 3 get inserting-peeks keys ] unit-test [ { } ] [ 1 get 3 get inserting-peeks' ] unit-test
[ { } ] [ 1 get 3 get inserting-replaces keys ] unit-test [ { } ] [ 1 get 3 get inserting-replaces' ] unit-test
[ { D 1 } ] [ 1 get 4 get inserting-peeks keys ] unit-test [ { D 1 } ] [ 1 get 4 get inserting-peeks' ] unit-test
[ { } ] [ 2 get 4 get inserting-replaces keys ] unit-test [ { } ] [ 2 get 4 get inserting-replaces' ] unit-test
[ { } ] [ 4 get 5 get inserting-peeks keys ] unit-test [ { } ] [ 4 get 5 get inserting-peeks' ] unit-test
[ { D 1 } ] [ 4 get 5 get inserting-replaces keys ] unit-test [ { D 1 } ] [ 4 get 5 get inserting-replaces' ] unit-test
[ t ] [ D 0 1 get peek-out key? ] unit-test [ t ] [ D 0 1 get peek-out key? ] unit-test
[ f ] [ D 1 1 get peek-out key? ] unit-test [ f ] [ D 1 1 get peek-out key? ] unit-test
@ -219,6 +238,7 @@ V{
} 2 test-bb } 2 test-bb
V{ V{
T{ ##load-immediate f V int-regs 2 100 }
T{ ##replace f V int-regs 2 D 1 } T{ ##replace f V int-regs 2 D 1 }
T{ ##inc-d f -1 } T{ ##inc-d f -1 }
T{ ##peek f V int-regs 4 D 1 } T{ ##peek f V int-regs 4 D 1 }
@ -226,6 +246,7 @@ V{
} 3 test-bb } 3 test-bb
V{ V{
T{ ##load-immediate f V int-regs 3 100 }
T{ ##replace f V int-regs 3 D 0 } T{ ##replace f V int-regs 3 D 0 }
T{ ##branch } T{ ##branch }
} 4 test-bb } 4 test-bb
@ -248,16 +269,16 @@ V{
[ t ] [ D 1 2 get peek-in key? ] unit-test [ t ] [ D 1 2 get peek-in key? ] unit-test
[ f ] [ D 1 3 get peek-in key? ] unit-test [ f ] [ D 1 3 get peek-in key? ] unit-test
[ { D 0 } ] [ 0 get 1 get inserting-peeks keys ] unit-test [ { D 0 } ] [ 0 get 1 get inserting-peeks' ] unit-test
[ { } ] [ 0 get 1 get inserting-replaces keys ] unit-test [ { } ] [ 0 get 1 get inserting-replaces' ] unit-test
[ { D 1 } ] [ 1 get 2 get inserting-peeks keys ] unit-test [ { D 1 } ] [ 1 get 2 get inserting-peeks' ] unit-test
[ { } ] [ 1 get 2 get inserting-replaces keys ] unit-test [ { } ] [ 1 get 2 get inserting-replaces' ] unit-test
[ { D 2 } ] [ 1 get 3 get inserting-peeks keys ] unit-test [ { D 2 } ] [ 1 get 3 get inserting-peeks' ] unit-test
[ { } ] [ 1 get 3 get inserting-replaces keys ] unit-test [ { } ] [ 1 get 3 get inserting-replaces' ] unit-test
[ { } ] [ 3 get 4 get inserting-peeks keys ] unit-test [ { } ] [ 3 get 4 get inserting-peeks' ] unit-test
[ { } ] [ 2 get 4 get inserting-replaces keys ] unit-test [ { } ] [ 2 get 4 get inserting-replaces' ] unit-test
[ { } ] [ 3 get 4 get inserting-replaces keys ] unit-test [ { } ] [ 3 get 4 get inserting-replaces' ] unit-test
[ { D 0 } ] [ 4 get 5 get inserting-replaces keys ] unit-test [ { D 0 } ] [ 4 get 5 get inserting-replaces' ] unit-test
V{ V{
T{ ##prologue } T{ ##prologue }
@ -281,9 +302,14 @@ V{
V{ V{
T{ ##peek f V int-regs 1 D 0 } T{ ##peek f V int-regs 1 D 0 }
T{ ##return } T{ ##branch }
} 4 test-bb } 4 test-bb
V{
T{ ##epilogue }
T{ ##return }
} 5 test-bb
[ t ] [ 0 get kill-block? ] unit-test [ t ] [ 0 get kill-block? ] unit-test
[ t ] [ 3 get kill-block? ] unit-test [ t ] [ 3 get kill-block? ] unit-test
@ -291,6 +317,7 @@ V{
1 get 2 get 3 get V{ } 2sequence >>successors drop 1 get 2 get 3 get V{ } 2sequence >>successors drop
2 get 4 get 1vector >>successors drop 2 get 4 get 1vector >>successors drop
3 get 4 get 1vector >>successors drop 3 get 4 get 1vector >>successors drop
4 get 5 get 1vector >>successors drop
[ ] [ test-global-dcn ] unit-test [ ] [ test-global-dcn ] unit-test
@ -299,11 +326,11 @@ V{
[ f ] [ D 1 3 get avail-out key? ] unit-test [ f ] [ D 1 3 get avail-out key? ] unit-test
[ f ] [ D 1 4 get avail-in key? ] unit-test [ f ] [ D 1 4 get avail-in key? ] unit-test
[ { D 1 } ] [ 0 get 1 get inserting-peeks keys ] unit-test [ { D 1 } ] [ 0 get 1 get inserting-peeks' ] unit-test
[ { } ] [ 1 get 2 get inserting-peeks keys ] unit-test [ { } ] [ 1 get 2 get inserting-peeks' ] unit-test
[ { } ] [ 1 get 3 get inserting-peeks keys ] unit-test [ { } ] [ 1 get 3 get inserting-peeks' ] unit-test
[ { } ] [ 2 get 4 get inserting-peeks keys ] unit-test [ { } ] [ 2 get 4 get inserting-peeks' ] unit-test
[ { D 0 } ] [ 3 get 4 get inserting-peeks keys ] unit-test [ { D 0 } ] [ 3 get 4 get inserting-peeks' ] unit-test
V{ V{
T{ ##prologue } T{ ##prologue }
@ -315,7 +342,7 @@ V{
T{ ##branch } T{ ##branch }
} 1 test-bb } 1 test-bb
V{ T{ ##return } } 2 test-bb V{ T{ ##epilogue } T{ ##return } } 2 test-bb
V{ T{ ##branch } } 3 test-bb V{ T{ ##branch } } 3 test-bb
@ -327,10 +354,10 @@ V{ T{ ##branch } } 3 test-bb
[ t ] [ D 0 1 get avail-out key? ] unit-test [ t ] [ D 0 1 get avail-out key? ] unit-test
[ { D 0 } ] [ 0 get 1 get inserting-peeks keys ] unit-test [ { D 0 } ] [ 0 get 1 get inserting-peeks' ] unit-test
[ { } ] [ 1 get 2 get inserting-peeks keys ] unit-test [ { } ] [ 1 get 2 get inserting-peeks' ] unit-test
[ { } ] [ 1 get 3 get inserting-peeks keys ] unit-test [ { } ] [ 1 get 3 get inserting-peeks' ] unit-test
[ { } ] [ 3 get 1 get inserting-peeks keys ] unit-test [ { } ] [ 3 get 1 get inserting-peeks' ] unit-test
V{ V{
T{ ##prologue } T{ ##prologue }
@ -374,13 +401,13 @@ V{
[ ] [ test-global-dcn ] unit-test [ ] [ test-global-dcn ] unit-test
[ { } ] [ 0 get 1 get inserting-peeks keys ] unit-test [ { } ] [ 0 get 1 get inserting-peeks' ] unit-test
[ { } ] [ 1 get 2 get inserting-peeks keys ] unit-test [ { } ] [ 1 get 2 get inserting-peeks' ] unit-test
[ { } ] [ 3 get 4 get inserting-peeks keys ] unit-test [ { } ] [ 3 get 4 get inserting-peeks' ] unit-test
[ { D 0 } ] [ 2 get 4 get inserting-peeks keys ] unit-test [ { D 0 } ] [ 2 get 4 get inserting-peeks' ] unit-test
[ { D 0 } ] [ 1 get 3 get inserting-peeks keys ] unit-test [ { D 0 } ] [ 1 get 3 get inserting-peeks' ] unit-test
[ { } ] [ 4 get 5 get inserting-peeks keys ] unit-test [ { } ] [ 4 get 5 get inserting-peeks' ] unit-test
[ { } ] [ 5 get 6 get inserting-peeks keys ] unit-test [ { } ] [ 5 get 6 get inserting-peeks' ] unit-test
V{ V{
T{ ##prologue } T{ ##prologue }
@ -392,6 +419,7 @@ V{
} 1 test-bb } 1 test-bb
V{ V{
T{ ##load-immediate f V int-regs 1 100 }
T{ ##replace f V int-regs 1 D 0 } T{ ##replace f V int-regs 1 D 0 }
T{ ##branch } T{ ##branch }
} 2 test-bb } 2 test-bb
@ -419,16 +447,16 @@ V{
[ ] [ test-global-dcn ] unit-test [ ] [ test-global-dcn ] unit-test
[ { } ] [ 1 get 2 get inserting-peeks keys ] unit-test [ { } ] [ 1 get 2 get inserting-peeks' ] unit-test
[ { } ] [ 1 get 2 get inserting-replaces keys ] unit-test [ { } ] [ 1 get 2 get inserting-replaces' ] unit-test
[ { D 0 } ] [ 1 get 3 get inserting-peeks keys ] unit-test [ { D 0 } ] [ 1 get 3 get inserting-peeks' ] unit-test
[ { } ] [ 1 get 3 get inserting-replaces keys ] unit-test [ { } ] [ 1 get 3 get inserting-replaces' ] unit-test
[ { } ] [ 2 get 4 get inserting-peeks keys ] unit-test [ { } ] [ 2 get 4 get inserting-peeks' ] unit-test
[ { D 0 } ] [ 2 get 4 get inserting-replaces keys ] unit-test [ { D 0 } ] [ 2 get 4 get inserting-replaces' ] unit-test
[ { } ] [ 3 get 4 get inserting-peeks keys ] unit-test [ { } ] [ 3 get 4 get inserting-peeks' ] unit-test
[ { } ] [ 3 get 4 get inserting-replaces keys ] unit-test [ { } ] [ 3 get 4 get inserting-replaces' ] unit-test
[ { } ] [ 4 get 5 get inserting-peeks keys ] unit-test [ { } ] [ 4 get 5 get inserting-peeks' ] unit-test
[ { } ] [ 4 get 5 get inserting-replaces keys ] unit-test [ { } ] [ 4 get 5 get inserting-replaces' ] unit-test
V{ V{
T{ ##prologue } T{ ##prologue }
@ -440,11 +468,13 @@ V{
} 1 test-bb } 1 test-bb
V{ V{
T{ ##load-immediate f V int-regs 1 100 }
T{ ##replace f V int-regs 1 D 0 } T{ ##replace f V int-regs 1 D 0 }
T{ ##branch } T{ ##branch }
} 2 test-bb } 2 test-bb
V{ V{
T{ ##load-immediate f V int-regs 2 100 }
T{ ##replace f V int-regs 2 D 0 } T{ ##replace f V int-regs 2 D 0 }
T{ ##branch } T{ ##branch }
} 3 test-bb } 3 test-bb
@ -466,11 +496,11 @@ V{
[ ] [ test-global-dcn ] unit-test [ ] [ test-global-dcn ] unit-test
[ { } ] [ 2 get 4 get inserting-replaces keys ] unit-test [ { } ] [ 2 get 4 get inserting-replaces' ] unit-test
[ { } ] [ 3 get 4 get inserting-replaces keys ] unit-test [ { } ] [ 3 get 4 get inserting-replaces' ] unit-test
[ { D 0 } ] [ 4 get 5 get inserting-replaces keys ] unit-test [ { D 0 } ] [ 4 get 5 get inserting-replaces' ] unit-test
! Dead replace elimination ! Dead replace elimination
V{ V{
@ -483,10 +513,12 @@ V{
T{ ##peek f V int-regs 1 D 1 } T{ ##peek f V int-regs 1 D 1 }
T{ ##replace f V int-regs 1 D 0 } T{ ##replace f V int-regs 1 D 0 }
T{ ##replace f V int-regs 0 D 1 } T{ ##replace f V int-regs 0 D 1 }
T{ ##branch }
} 1 test-bb } 1 test-bb
V{ V{
T{ ##inc-d f -2 } T{ ##inc-d f -2 }
T{ ##branch }
} 2 test-bb } 2 test-bb
V{ V{
@ -500,6 +532,90 @@ V{
[ ] [ test-global-dcn ] unit-test [ ] [ test-global-dcn ] unit-test
[ { } ] [ 0 get 1 get inserting-replaces keys ] unit-test [ { } ] [ 0 get 1 get inserting-replaces' ] unit-test
[ { } ] [ 1 get 2 get inserting-replaces keys ] unit-test [ { } ] [ 1 get 2 get inserting-replaces' ] unit-test
[ { } ] [ 2 get 3 get inserting-replaces keys ] unit-test [ { } ] [ 2 get 3 get inserting-replaces' ] unit-test
! More dead replace elimination tests
V{
T{ ##prologue }
T{ ##branch }
} 0 test-bb
V{
T{ ##peek { dst V int-regs 10 } { loc D 0 } }
T{ ##inc-d { n -1 } }
T{ ##inc-r { n 1 } }
T{ ##replace { src V int-regs 10 } { loc R 0 } }
T{ ##peek { dst V int-regs 12 } { loc R 0 } }
T{ ##inc-r { n -1 } }
T{ ##inc-d { n 1 } }
T{ ##replace { src V int-regs 12 } { loc D 0 } }
T{ ##branch }
} 1 test-bb
V{
T{ ##epilogue }
T{ ##return }
} 2 test-bb
0 get 1 get 1vector >>successors drop
1 get 2 get 1vector >>successors drop
[ ] [ test-global-dcn ] unit-test
[ { } ] [ 1 get 2 get inserting-replaces' ] unit-test
! Check that retain stack usage works
V{
T{ ##prologue }
T{ ##branch }
} 0 test-bb
V{
T{ ##peek f V int-regs 0 D 0 }
T{ ##inc-d f -1 }
T{ ##inc-r f 1 }
T{ ##replace f V int-regs 0 R 0 }
T{ ##branch }
} 1 test-bb
V{
T{ ##call f + -1 }
T{ ##branch }
} 2 test-bb
V{
T{ ##peek f V int-regs 0 R 0 }
T{ ##inc-r f -1 }
T{ ##inc-d f 1 }
T{ ##replace f V int-regs 0 D 0 }
T{ ##branch }
} 3 test-bb
V{
T{ ##epilogue }
T{ ##return }
} 4 test-bb
0 get 1 get 1vector >>successors drop
1 get 2 get 1vector >>successors drop
2 get 3 get 1vector >>successors drop
3 get 4 get 1vector >>successors drop
[ ] [ test-global-dcn ] unit-test
[ ##replace D 0 ] [
3 get successors>> first instructions>> first
[ class ] [ loc>> ] bi
] unit-test
[ ##replace R 0 ] [
1 get successors>> first instructions>> first
[ class ] [ loc>> ] bi
] unit-test
[ ##peek R 0 ] [
2 get successors>> first instructions>> first
[ class ] [ loc>> ] bi
] unit-test

View File

@ -53,16 +53,6 @@ M: ##inc-r rs-height-change n>> ;
: compute-rs-height ( bb -- ) : compute-rs-height ( bb -- )
in-rs-heights out-rs-heights [ rs-height-change ] compute-height ; in-rs-heights out-rs-heights [ rs-height-change ] compute-height ;
GENERIC# translate-loc 1 ( loc bb -- loc' )
M: ds-loc translate-loc [ n>> ] [ in-ds-heights get at ] bi* - <ds-loc> ;
M: rs-loc translate-loc [ n>> ] [ in-rs-heights get at ] bi* - <ds-loc> ;
GENERIC# untranslate-loc 1 ( loc bb -- loc' )
M: ds-loc untranslate-loc [ n>> ] [ in-ds-heights get at ] bi* + <ds-loc> ;
M: rs-loc untranslate-loc [ n>> ] [ in-rs-heights get at ] bi* + <ds-loc> ;
PRIVATE> PRIVATE>
: compute-heights ( cfg -- ) : compute-heights ( cfg -- )
@ -75,8 +65,18 @@ PRIVATE>
[ compute-ds-height ] bi [ compute-ds-height ] bi
] each-basic-block ; ] each-basic-block ;
GENERIC# translate-loc 1 ( loc bb -- loc' )
M: ds-loc translate-loc [ n>> ] [ in-ds-heights get at ] bi* - <ds-loc> ;
M: rs-loc translate-loc [ n>> ] [ in-rs-heights get at ] bi* - <rs-loc> ;
: translate-locs ( assoc bb -- assoc' ) : translate-locs ( assoc bb -- assoc' )
'[ [ _ translate-loc ] dip ] assoc-map ; '[ [ _ translate-loc ] dip ] assoc-map ;
GENERIC# untranslate-loc 1 ( loc bb -- loc' )
M: ds-loc untranslate-loc [ n>> ] [ in-ds-heights get at ] bi* + <ds-loc> ;
M: rs-loc untranslate-loc [ n>> ] [ in-rs-heights get at ] bi* + <rs-loc> ;
: untranslate-locs ( assoc bb -- assoc' ) : untranslate-locs ( assoc bb -- assoc' )
'[ [ _ untranslate-loc ] dip ] assoc-map ; '[ [ _ untranslate-loc ] dip ] assoc-map ;

View File

@ -61,20 +61,24 @@ M: ##copy visit
ds-height get dup 0 = [ drop ] [ ##inc-d ] if ds-height get dup 0 = [ drop ] [ ##inc-d ] if
rs-height get dup 0 = [ drop ] [ ##inc-r ] if ; rs-height get dup 0 = [ drop ] [ ##inc-r ] if ;
: init-local-analysis ( -- )
0 ds-height set
0 rs-height set
H{ } clone copies set
H{ } clone reads-locations set
H{ } clone writes-locations set ;
: local-analysis ( bb -- ) : local-analysis ( bb -- )
! Removes all ##peek and ##replace from the basic block. ! Removes all ##peek and ##replace from the basic block.
! Conceptually, moves all ##peeks to the start ! Conceptually, moves all ##peeks to the start
! (reads-locations assoc) and all ##replaces to the end ! (reads-locations assoc) and all ##replaces to the end
! (writes-locations assoc). ! (writes-locations assoc).
0 ds-height set init-local-analysis
0 rs-height set
H{ } clone copies set
H{ } clone reads-locations set
H{ } clone writes-locations set
[ [
[ [
[ visit ] each unclip-last-slice [ [ visit ] each ] dip
insert-height-changes insert-height-changes
,
] V{ } make ] V{ } make
] change-instructions drop ; ] change-instructions drop ;

View File

@ -11,32 +11,35 @@ IN: compiler.cfg.dcn.rewrite
! vreg. SSA is reconstructed afterwards. ! vreg. SSA is reconstructed afterwards.
: inserting-peeks ( from to -- assoc ) : inserting-peeks ( from to -- assoc )
[ peek-in swap [ peek-out ] [ avail-out ] bi
peek-in swap [ peek-out ] [ avail-out ] bi assoc-union assoc-diff ;
assoc-union assoc-diff
] keep untranslate-locs ;
: remove-dead-stores ( assoc -- assoc' ) : remove-dead-stores ( assoc -- assoc' )
[ drop n>> 0 >= ] assoc-filter ; [ drop n>> 0 >= ] assoc-filter ;
: inserting-replaces ( from to -- assoc ) : inserting-replaces ( from to -- assoc )
[ [ replace-out ] [ [ kill-in ] [ replace-in ] bi ] bi*
[ replace-out ] [ [ kill-in ] [ replace-in ] bi ] bi* assoc-union assoc-diff ;
assoc-union assoc-diff
] keep untranslate-locs remove-dead-stores ;
SYMBOL: locs>vregs SYMBOL: locs>vregs
: loc>vreg ( loc -- vreg ) locs>vregs get [ drop i ] cache ; : loc>vreg ( loc -- vreg ) locs>vregs get [ drop i ] cache ;
: each-insertion ( assoc quot: ( vreg loc -- ) -- ) : each-insertion ( assoc bb quot: ( vreg loc -- ) -- )
'[ drop [ loc>vreg ] keep @ ] assoc-each ; inline '[ drop [ loc>vreg ] [ _ untranslate-loc ] bi @ ] assoc-each ; inline
ERROR: bad-peek dst loc ;
: insert-peeks ( from to -- )
[ inserting-peeks ] keep
[ dup n>> 0 < [ bad-peek ] [ ##peek ] if ] each-insertion ;
: insert-replaces ( from to -- )
[ inserting-replaces ] keep
[ dup n>> 0 < [ 2drop ] [ ##replace ] if ] each-insertion ;
: visit-edge ( from to -- ) : visit-edge ( from to -- )
2dup [ 2dup [ [ insert-peeks ] [ insert-replaces ] 2bi ] V{ } make
[ inserting-peeks [ ##peek ] each-insertion ]
[ inserting-replaces [ ##replace ] each-insertion ] 2bi
] V{ } make
[ 2drop ] [ <simple-block> insert-basic-block ] if-empty ; [ 2drop ] [ <simple-block> insert-basic-block ] if-empty ;
: visit-edges ( bb -- ) : visit-edges ( bb -- )

View File

@ -5,6 +5,9 @@ compiler.cfg.tco
compiler.cfg.predecessors compiler.cfg.predecessors
compiler.cfg.useless-conditionals compiler.cfg.useless-conditionals
compiler.cfg.stack-analysis compiler.cfg.stack-analysis
compiler.cfg.dcn
compiler.cfg.dominance
compiler.cfg.ssa
compiler.cfg.branch-splitting compiler.cfg.branch-splitting
compiler.cfg.block-joining compiler.cfg.block-joining
compiler.cfg.alias-analysis compiler.cfg.alias-analysis
@ -24,17 +27,24 @@ SYMBOL: check-optimizer?
dup check-cfg dup check-cfg
] when ; ] when ;
SYMBOL: new-optimizer?
: optimize-cfg ( cfg -- cfg' ) : optimize-cfg ( cfg -- cfg' )
! Note that compute-predecessors has to be called several times. ! Note that compute-predecessors has to be called several times.
! The passes that need this document it. ! The passes that need this document it.
[ [
optimize-tail-calls optimize-tail-calls
delete-useless-conditionals new-optimizer? get [ delete-useless-conditionals ] unless
compute-predecessors compute-predecessors
split-branches new-optimizer? get [ split-branches ] unless
new-optimizer? get [
deconcatenatize
compute-dominance
construct-ssa
] when
join-blocks join-blocks
compute-predecessors compute-predecessors
stack-analysis new-optimizer? get [ stack-analysis ] unless
compute-liveness compute-liveness
alias-analysis alias-analysis
value-numbering value-numbering