Merge branch 'master' of git://factorcode.org/git/factor
commit
777bda70dc
|
@ -0,0 +1,2 @@
|
||||||
|
Slava Pestov
|
||||||
|
Daniel Ehrenberg
|
|
@ -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
|
|
@ -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 ;
|
||||||
|
|
|
@ -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 ;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue