Merge branch 'master' of git://factorcode.org/git/factor

db4
Slava Pestov 2009-08-02 17:07:06 -05:00
commit 777bda70dc
7 changed files with 64 additions and 41 deletions

View File

@ -0,0 +1,2 @@
Slava Pestov
Daniel Ehrenberg

View File

@ -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

View File

@ -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. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays kernel assocs sequences namespaces fry 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 IN: compiler.cfg.def-use
GENERIC: defs-vreg ( insn -- vreg/f ) GENERIC: defs-vreg ( insn -- vreg/f )
@ -80,18 +80,18 @@ SYMBOLS: defs insns uses ;
] each-basic-block ] each-basic-block
] keep insns set ; ] keep insns set ;
: compute-uses ( cfg -- ) :: compute-uses ( cfg -- )
H{ } clone [ ! Here, a phi node uses its argument in the block that it comes from.
'[ H{ } clone :> use
dup instructions>> [ cfg [| block |
uses-vregs [ block instructions>> [
_ conjoin-at dup ##phi?
] with each [ inputs>> [ use conjoin-at ] assoc-each ]
] with each [ uses-vregs [ block swap use conjoin-at ] each ]
] each-basic-block if
] keep ] each
[ keys ] assoc-map ] each-basic-block
uses set ; use [ keys ] assoc-map uses set ;
: compute-def-use ( cfg -- ) : compute-def-use ( cfg -- )
[ compute-defs ] [ compute-uses ] [ compute-insns ] tri ; [ compute-defs ] [ compute-uses ] [ compute-insns ] tri ;

View File

@ -8,7 +8,7 @@ compiler.cfg.def-use
compiler.cfg.renaming compiler.cfg.renaming
compiler.cfg.dominance compiler.cfg.dominance
compiler.cfg.instructions compiler.cfg.instructions
compiler.cfg.liveness.ssa compiler.cfg.ssa.liveness
compiler.cfg.ssa.cssa compiler.cfg.ssa.cssa
compiler.cfg.ssa.interference compiler.cfg.ssa.interference
compiler.cfg.ssa.interference.live-ranges compiler.cfg.ssa.interference.live-ranges
@ -97,11 +97,11 @@ M: insn prepare-insn drop ;
: destruct-ssa ( cfg -- cfg' ) : destruct-ssa ( cfg -- cfg' )
dup cfg-has-phis? [ dup cfg-has-phis? [
dup construct-cssa dup construct-cssa
compute-ssa-live-sets dup precompute-liveness
dup compute-defs dup compute-defs
dup compute-dominance dup compute-dominance
dup compute-live-ranges dup compute-live-ranges
dup prepare-coalescing dup prepare-coalescing
process-copies process-copies
dup perform-renaming dup perform-renaming
] when ; ] when ;

View File

@ -1,6 +1,6 @@
USING: accessors compiler.cfg compiler.cfg.debugger USING: accessors compiler.cfg compiler.cfg.debugger
compiler.cfg.def-use compiler.cfg.dominance 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.registers compiler.cfg.predecessors
compiler.cfg.ssa.interference compiler.cfg.ssa.interference
compiler.cfg.ssa.interference.live-ranges cpu.architecture compiler.cfg.ssa.interference.live-ranges cpu.architecture
@ -9,8 +9,8 @@ IN: compiler.cfg.ssa.interference.tests
: test-interference ( -- ) : test-interference ( -- )
cfg new 0 get >>entry cfg new 0 get >>entry
compute-ssa-live-sets
compute-predecessors compute-predecessors
dup precompute-liveness
dup compute-defs dup compute-defs
dup compute-dominance dup compute-dominance
compute-live-ranges ; 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 3 V int-regs 5 vregs-interfere? ] unit-test
[ t ] [ V int-regs 5 V int-regs 3 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 3 V int-regs 6 vregs-interfere? ] unit-test
[ f ] [ V int-regs 6 V int-regs 3 vregs-interfere? ] unit-test [ f ] [ V int-regs 6 V int-regs 3 vregs-interfere? ] unit-test

View File

@ -2,7 +2,7 @@
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors assocs fry kernel namespaces sequences math USING: accessors assocs fry kernel namespaces sequences math
arrays compiler.cfg.def-use compiler.cfg.instructions 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 IN: compiler.cfg.ssa.interference.live-ranges
! Live ranges for interference testing ! Live ranges for interference testing

View File

@ -97,31 +97,15 @@ SYMBOL: phi-outs
H{ } T_q-sets set H{ } T_q-sets set
[ next-T_q drop ] each-basic-block ; [ 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> PRIVATE>
: precompute-liveness ( cfg -- ) : precompute-liveness ( cfg -- )
! The first three of these depend only on the graph ! Maybe dominance and def-use should be called before this, separately
! structure of the CFG, and don't need to be recomputed
! if that doesn't change
{ {
[ compute-dominance ]
[ compute-def-use ]
[ compute-R_q ] [ compute-R_q ]
[ compute-T_q ] [ compute-T_q ]
[ compute-dominance ]
[ compute-defs ]
[ compute-phi-uses ]
} cleave ; } cleave ;
<PRIVATE <PRIVATE