diff --git a/basis/compiler/cfg/liveness/liveness-tests.factor b/basis/compiler/cfg/liveness/liveness-tests.factor new file mode 100644 index 0000000000..271dc60d76 --- /dev/null +++ b/basis/compiler/cfg/liveness/liveness-tests.factor @@ -0,0 +1,15 @@ +USING: compiler.cfg compiler.cfg.instructions compiler.cfg.registers +compiler.cfg.liveness accessors tools.test cpu.architecture ; +IN: compiler.cfg.liveness.tests + +[ + H{ + { "A" H{ { V int-regs 1 V int-regs 1 } { V int-regs 4 V int-regs 4 } } } + { "B" H{ { V int-regs 3 V int-regs 3 } { V int-regs 2 V int-regs 2 } } } + } +] [ + V{ + T{ ##phi f V int-regs 0 { { "A" V int-regs 1 } { "B" V int-regs 2 } } } + T{ ##phi f V int-regs 1 { { "B" V int-regs 3 } { "A" V int-regs 4 } } } + } >>instructions compute-phi-live-in +] unit-test \ No newline at end of file diff --git a/basis/compiler/cfg/liveness/liveness.factor b/basis/compiler/cfg/liveness/liveness.factor index 6c40bb3782..8a46b32070 100644 --- a/basis/compiler/cfg/liveness/liveness.factor +++ b/basis/compiler/cfg/liveness/liveness.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: kernel namespaces deques accessors sets sequences assocs fry -dlists compiler.cfg.def-use compiler.cfg.instructions +hashtables dlists compiler.cfg.def-use compiler.cfg.instructions compiler.cfg.rpo ; IN: compiler.cfg.liveness @@ -16,9 +16,7 @@ SYMBOL: live-ins ! is in conrrespondence with a predecessor SYMBOL: phi-live-ins -: phi-live-in ( predecessor basic-block -- set ) - [ predecessors>> index ] keep phi-live-ins get at - dup [ nth ] [ 2drop f ] if ; +: phi-live-in ( predecessor basic-block -- set ) phi-live-ins get at at ; ! Assoc mapping basic blocks to sets of vregs SYMBOL: live-outs @@ -45,9 +43,15 @@ SYMBOL: work-list [ nip kill-set ] 2bi assoc-diff ; +: conjoin-at ( value key assoc -- ) + [ dupd ?set-at ] change-at ; + : compute-phi-live-in ( basic-block -- phi-live-in ) - instructions>> [ ##phi? ] filter - [ f ] [ [ inputs>> ] map flip [ unique ] map ] if-empty ; + instructions>> [ ##phi? ] filter [ f ] [ + H{ } clone [ + '[ inputs>> [ swap _ conjoin-at ] assoc-each ] each + ] keep + ] if-empty ; : update-live-in ( basic-block -- changed? ) [ [ compute-live-in ] keep live-ins get maybe-set-at ] diff --git a/basis/compiler/cfg/stack-analysis/merge/merge-tests.factor b/basis/compiler/cfg/stack-analysis/merge/merge-tests.factor index e519308974..14a81958a9 100644 --- a/basis/compiler/cfg/stack-analysis/merge/merge-tests.factor +++ b/basis/compiler/cfg/stack-analysis/merge/merge-tests.factor @@ -17,7 +17,7 @@ sequences kernel classes ; H{ { D 0 V int-regs 0 } } >>locs>vregs H{ { D 0 V int-regs 1 } } >>locs>vregs 2array - [ merge-locs locs>vregs>> keys ] { } make first inputs>> + [ merge-locs locs>vregs>> keys ] { } make first inputs>> values ] unit-test [