compiler.cfg.stacks.local: to simplify, end-local-analysis can take the block it operates on as argument
parent
b983053130
commit
0ff4c68e15
|
@ -12,7 +12,7 @@ IN: compiler.cfg.builder.blocks
|
|||
begin-local-analysis ;
|
||||
|
||||
: end-basic-block ( -- )
|
||||
basic-block get [ end-local-analysis ] when
|
||||
basic-block get [ end-local-analysis ] when*
|
||||
building off
|
||||
basic-block off ;
|
||||
|
||||
|
@ -20,7 +20,7 @@ IN: compiler.cfg.builder.blocks
|
|||
<basic-block> basic-block get [ over connect-bbs ] when* set-basic-block ;
|
||||
|
||||
: begin-basic-block ( -- )
|
||||
basic-block get [ end-local-analysis ] when
|
||||
basic-block get [ end-local-analysis ] when*
|
||||
(begin-basic-block) ;
|
||||
|
||||
: emit-trivial-block ( quot -- )
|
||||
|
@ -50,7 +50,7 @@ IN: compiler.cfg.builder.blocks
|
|||
##branch,
|
||||
end-local-analysis
|
||||
height-state get clone-height-state 2array
|
||||
] when ;
|
||||
] when* ;
|
||||
|
||||
: with-branch ( quot -- pair/f )
|
||||
[ begin-branch call end-branch ] with-scope ; inline
|
||||
|
|
|
@ -1,9 +1,13 @@
|
|||
! Copyright (C) 2009 Slava Pestov.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: assocs combinators compiler.cfg.dataflow-analysis
|
||||
compiler.cfg.stacks.local kernel ;
|
||||
compiler.cfg.stacks.local kernel namespaces ;
|
||||
IN: compiler.cfg.stacks.global
|
||||
|
||||
: peek-set ( bb -- assoc ) peek-sets get at ;
|
||||
: replace-set ( bb -- assoc ) replace-sets get at ;
|
||||
: kill-set ( bb -- assoc ) kill-sets get at ;
|
||||
|
||||
: transfer-peeked-locs ( assoc bb -- assoc' )
|
||||
[ replace-set assoc-diff ] [ peek-set assoc-union ] bi ;
|
||||
|
||||
|
|
|
@ -1,9 +1,41 @@
|
|||
USING: accessors assocs biassocs combinators compiler.cfg
|
||||
compiler.cfg.instructions compiler.cfg.registers compiler.cfg.stacks
|
||||
compiler.cfg.stacks.height compiler.cfg.stacks.local compiler.cfg.utilities
|
||||
compiler.test cpu.architecture namespaces kernel tools.test ;
|
||||
compiler.test cpu.architecture make namespaces kernel tools.test ;
|
||||
IN: compiler.cfg.stacks.local.tests
|
||||
|
||||
! loc>vreg
|
||||
{ 1 } [
|
||||
D 0 loc>vreg
|
||||
] cfg-unit-test
|
||||
|
||||
! stack-changes
|
||||
{
|
||||
{
|
||||
T{ ##copy { dst 1 } { src 25 } { rep any-rep } }
|
||||
T{ ##copy { dst 2 } { src 26 } { rep any-rep } }
|
||||
}
|
||||
} [
|
||||
{ { D 0 25 } { R 0 26 } } stack-changes
|
||||
] cfg-unit-test
|
||||
|
||||
! replace-loc
|
||||
{ 80 } [
|
||||
80 D 77 replace-loc
|
||||
D 77 peek-loc
|
||||
] cfg-unit-test
|
||||
|
||||
! end-local-analysis
|
||||
{
|
||||
H{ }
|
||||
H{ }
|
||||
H{ }
|
||||
} [
|
||||
"foo" [ "eh" , end-local-analysis ] V{ } make drop
|
||||
"foo" [ peek-sets ] [ replace-sets ] [ kill-sets ] tri [ get at ] 2tri@
|
||||
] cfg-unit-test
|
||||
|
||||
! height-state
|
||||
{
|
||||
{ { 3 3 } { 0 0 } }
|
||||
} [
|
||||
|
@ -23,23 +55,7 @@ IN: compiler.cfg.stacks.local.tests
|
|||
{ { 0 4 } { 0 -2 } } height-state>insns
|
||||
] unit-test
|
||||
|
||||
{ 1 } [
|
||||
D 0 loc>vreg
|
||||
] cfg-unit-test
|
||||
|
||||
{
|
||||
{
|
||||
T{ ##copy { dst 1 } { src 25 } { rep any-rep } }
|
||||
T{ ##copy { dst 2 } { src 26 } { rep any-rep } }
|
||||
}
|
||||
} [
|
||||
{ { D 0 25 } { R 0 26 } } stack-changes
|
||||
] cfg-unit-test
|
||||
|
||||
{ 80 } [
|
||||
80 D 77 replace-loc
|
||||
D 77 peek-loc
|
||||
] cfg-unit-test
|
||||
|
||||
{ H{ { D -1 40 } } } [
|
||||
D 1 inc-stack 40 D 0 replace-loc replace-mapping get
|
||||
|
|
|
@ -84,15 +84,9 @@ SYMBOLS: local-peek-set local-replace-set replace-mapping ;
|
|||
replace-mapping get [ [ loc>vreg ] dip = not ] assoc-filter
|
||||
[ replace-mapping set ] [ keys unique local-replace-set set ] bi ;
|
||||
|
||||
: end-local-analysis ( -- )
|
||||
: end-local-analysis ( basic-block -- )
|
||||
remove-redundant-replaces
|
||||
emit-changes
|
||||
basic-block get {
|
||||
[ [ local-peek-set get ] dip peek-sets get set-at ]
|
||||
[ [ local-replace-set get ] dip replace-sets get set-at ]
|
||||
[ [ compute-local-kill-set ] dip kill-sets get set-at ]
|
||||
} cleave ;
|
||||
|
||||
: peek-set ( bb -- assoc ) peek-sets get at ;
|
||||
: replace-set ( bb -- assoc ) replace-sets get at ;
|
||||
: kill-set ( bb -- assoc ) kill-sets get at ;
|
||||
[ [ local-peek-set get ] dip peek-sets get set-at ]
|
||||
[ [ local-replace-set get ] dip replace-sets get set-at ]
|
||||
[ [ compute-local-kill-set ] dip kill-sets get set-at ] tri ;
|
||||
|
|
Loading…
Reference in New Issue