diff --git a/basis/compiler/cfg/def-use/authors.txt b/basis/compiler/cfg/def-use/authors.txt new file mode 100644 index 0000000000..a44f8d7f8d --- /dev/null +++ b/basis/compiler/cfg/def-use/authors.txt @@ -0,0 +1,2 @@ +Slava Pestov +Daniel Ehrenberg diff --git a/basis/compiler/cfg/def-use/def-use-tests.factor b/basis/compiler/cfg/def-use/def-use-tests.factor new file mode 100644 index 0000000000..1153d9ea81 --- /dev/null +++ b/basis/compiler/cfg/def-use/def-use-tests.factor @@ -0,0 +1,37 @@ +! Copyright (C) 2009 Daniel Ehrenberg. +! See http://factorcode.org/license.txt for BSD license. +USING: kernel tools.test accessors vectors sequences namespaces +arrays +cpu.architecture +compiler.cfg.def-use +compiler.cfg +compiler.cfg.debugger +compiler.cfg.instructions +compiler.cfg.registers ; + +V{ + T{ ##peek f V int-regs 0 D 0 } + T{ ##peek f V int-regs 1 D 0 } + T{ ##peek f V int-regs 2 D 0 } +} 1 test-bb +V{ + T{ ##replace f V int-regs 2 D 0 } +} 2 test-bb +1 get 2 get 1vector >>successors drop +V{ + T{ ##replace f V int-regs 0 D 0 } +} 3 test-bb +2 get 3 get 1vector >>successors drop +V{ } 4 test-bb +V{ } 5 test-bb +3 get 4 get 5 get V{ } 2sequence >>successors drop +V int-regs 2 + 2 get V int-regs 0 2array + 3 get V int-regs 1 2array +2array \ ##phi new-insn 1vector +6 test-bb +4 get 6 get 1vector >>successors drop +5 get 6 get 1vector >>successors drop + +cfg new 1 get >>entry 0 set +[ ] [ 0 get compute-def-use ] unit-test diff --git a/basis/compiler/cfg/def-use/def-use.factor b/basis/compiler/cfg/def-use/def-use.factor index 1c9ac90f78..8e8fbf3a2d 100644 --- a/basis/compiler/cfg/def-use/def-use.factor +++ b/basis/compiler/cfg/def-use/def-use.factor @@ -1,7 +1,7 @@ -! Copyright (C) 2008, 2009 Slava Pestov. +! Copyright (C) 2008, 2009 Slava Pestov, Daniel Ehrenberg. ! See http://factorcode.org/license.txt for BSD license. USING: accessors arrays kernel assocs sequences namespaces fry -sets compiler.cfg.rpo compiler.cfg.instructions ; +sets compiler.cfg.rpo compiler.cfg.instructions locals ; IN: compiler.cfg.def-use GENERIC: defs-vreg ( insn -- vreg/f ) @@ -80,18 +80,18 @@ SYMBOLS: defs insns uses ; ] each-basic-block ] keep insns set ; -: compute-uses ( cfg -- ) - H{ } clone [ - '[ - dup instructions>> [ - uses-vregs [ - _ conjoin-at - ] with each - ] with each - ] each-basic-block - ] keep - [ keys ] assoc-map - uses set ; +:: compute-uses ( cfg -- ) + ! Here, a phi node uses its argument in the block that it comes from. + H{ } clone :> use + cfg [| block | + block instructions>> [ + dup ##phi? + [ inputs>> [ use conjoin-at ] assoc-each ] + [ uses-vregs [ block swap use conjoin-at ] each ] + if + ] each + ] each-basic-block + use [ keys ] assoc-map uses set ; : compute-def-use ( cfg -- ) - [ compute-defs ] [ compute-uses ] [ compute-insns ] tri ; \ No newline at end of file + [ compute-defs ] [ compute-uses ] [ compute-insns ] tri ; diff --git a/basis/compiler/cfg/ssa/destruction/destruction.factor b/basis/compiler/cfg/ssa/destruction/destruction.factor index b251578bc8..535dc6db86 100644 --- a/basis/compiler/cfg/ssa/destruction/destruction.factor +++ b/basis/compiler/cfg/ssa/destruction/destruction.factor @@ -8,7 +8,7 @@ compiler.cfg.def-use compiler.cfg.renaming compiler.cfg.dominance compiler.cfg.instructions -compiler.cfg.liveness.ssa +compiler.cfg.ssa.liveness compiler.cfg.ssa.cssa compiler.cfg.ssa.interference compiler.cfg.ssa.interference.live-ranges @@ -97,11 +97,11 @@ M: insn prepare-insn drop ; : destruct-ssa ( cfg -- cfg' ) dup cfg-has-phis? [ dup construct-cssa - compute-ssa-live-sets + dup precompute-liveness dup compute-defs dup compute-dominance dup compute-live-ranges dup prepare-coalescing process-copies dup perform-renaming - ] when ; \ No newline at end of file + ] when ; diff --git a/basis/compiler/cfg/ssa/interference/interference-tests.factor b/basis/compiler/cfg/ssa/interference/interference-tests.factor index f8876755d9..9075d3b010 100644 --- a/basis/compiler/cfg/ssa/interference/interference-tests.factor +++ b/basis/compiler/cfg/ssa/interference/interference-tests.factor @@ -1,6 +1,6 @@ USING: accessors compiler.cfg compiler.cfg.debugger compiler.cfg.def-use compiler.cfg.dominance -compiler.cfg.instructions compiler.cfg.liveness.ssa +compiler.cfg.instructions compiler.cfg.ssa.liveness compiler.cfg.registers compiler.cfg.predecessors compiler.cfg.ssa.interference compiler.cfg.ssa.interference.live-ranges cpu.architecture @@ -9,8 +9,8 @@ IN: compiler.cfg.ssa.interference.tests : test-interference ( -- ) cfg new 0 get >>entry - compute-ssa-live-sets compute-predecessors + dup precompute-liveness dup compute-defs dup compute-dominance compute-live-ranges ; @@ -49,4 +49,4 @@ V{ [ t ] [ V int-regs 3 V int-regs 5 vregs-interfere? ] unit-test [ t ] [ V int-regs 5 V int-regs 3 vregs-interfere? ] unit-test [ f ] [ V int-regs 3 V int-regs 6 vregs-interfere? ] unit-test -[ f ] [ V int-regs 6 V int-regs 3 vregs-interfere? ] unit-test \ No newline at end of file +[ f ] [ V int-regs 6 V int-regs 3 vregs-interfere? ] unit-test diff --git a/basis/compiler/cfg/ssa/interference/live-ranges/live-ranges.factor b/basis/compiler/cfg/ssa/interference/live-ranges/live-ranges.factor index 151af8bea4..c29b69cf36 100644 --- a/basis/compiler/cfg/ssa/interference/live-ranges/live-ranges.factor +++ b/basis/compiler/cfg/ssa/interference/live-ranges/live-ranges.factor @@ -2,7 +2,7 @@ ! See http://factorcode.org/license.txt for BSD license. USING: accessors assocs fry kernel namespaces sequences math arrays compiler.cfg.def-use compiler.cfg.instructions -compiler.cfg.liveness.ssa compiler.cfg.rpo ; +compiler.cfg.ssa.liveness compiler.cfg.rpo ; IN: compiler.cfg.ssa.interference.live-ranges ! Live ranges for interference testing diff --git a/basis/compiler/cfg/ssa/liveness/liveness.factor b/basis/compiler/cfg/ssa/liveness/liveness.factor index 8788bc72f5..f2a195eb24 100644 --- a/basis/compiler/cfg/ssa/liveness/liveness.factor +++ b/basis/compiler/cfg/ssa/liveness/liveness.factor @@ -97,31 +97,15 @@ SYMBOL: phi-outs H{ } T_q-sets set [ next-T_q drop ] each-basic-block ; -:: compute-phi-uses ( cfg -- ) - ! Here, a phi node uses its argument in the block that it comes from. - H{ } clone :> use - cfg [| block | - block instructions>> [ - dup ##phi? - [ inputs>> [ use conjoin-at ] assoc-each ] - [ uses-vregs [ block swap use conjoin-at ] each ] - if - ] each - ] each-basic-block - use [ keys ] assoc-map uses set ; - PRIVATE> : precompute-liveness ( cfg -- ) - ! The first three of these depend only on the graph - ! structure of the CFG, and don't need to be recomputed - ! if that doesn't change + ! Maybe dominance and def-use should be called before this, separately { + [ compute-dominance ] + [ compute-def-use ] [ compute-R_q ] [ compute-T_q ] - [ compute-dominance ] - [ compute-defs ] - [ compute-phi-uses ] } cleave ;