--- /dev/null
+! 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
-! 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 )
] 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 ;