From d349cc565aa18f1e257cbd6424bcd73eedcbbd5b Mon Sep 17 00:00:00 2001 From: Daniel Ehrenberg Date: Sun, 2 Aug 2009 18:04:07 -0400 Subject: [PATCH] def-use puts phi uses in respective predecessors --- basis/compiler/cfg/def-use/authors.txt | 2 + .../compiler/cfg/def-use/def-use-tests.factor | 37 +++++++++++++++++++ basis/compiler/cfg/def-use/def-use.factor | 30 +++++++-------- 3 files changed, 54 insertions(+), 15 deletions(-) create mode 100644 basis/compiler/cfg/def-use/authors.txt create mode 100644 basis/compiler/cfg/def-use/def-use-tests.factor 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 ;