compiler.cfg.ssa.destruction.interference: fix a bug and add unit tests

db4
Slava Pestov 2009-08-02 08:11:30 -05:00
parent 7ec288b013
commit 87e13db946
2 changed files with 60 additions and 5 deletions

View File

@ -0,0 +1,52 @@
USING: accessors compiler.cfg compiler.cfg.debugger
compiler.cfg.def-use compiler.cfg.dominance
compiler.cfg.instructions compiler.cfg.liveness.ssa
compiler.cfg.registers compiler.cfg.predecessors
compiler.cfg.ssa.destruction.interference
compiler.cfg.ssa.destruction.live-ranges cpu.architecture
kernel namespaces tools.test ;
IN: compiler.cfg.ssa.destruction.interference.tests
: test-interference ( -- )
cfg new 0 get >>entry
compute-ssa-live-sets
compute-predecessors
dup compute-def-use
dup compute-dominance
compute-live-ranges ;
V{
T{ ##peek f V int-regs 0 D 0 }
T{ ##peek f V int-regs 2 D 0 }
T{ ##copy f V int-regs 1 V int-regs 0 }
T{ ##copy f V int-regs 3 V int-regs 2 }
T{ ##branch }
} 0 test-bb
V{
T{ ##peek f V int-regs 4 D 0 }
T{ ##peek f V int-regs 5 D 0 }
T{ ##replace f V int-regs 3 D 0 }
T{ ##peek f V int-regs 6 D 0 }
T{ ##replace f V int-regs 5 D 0 }
T{ ##return }
} 1 test-bb
0 1 edge
[ ] [ test-interference ] unit-test
[ f ] [ V int-regs 0 V int-regs 1 interferes? ] unit-test
[ f ] [ V int-regs 1 V int-regs 0 interferes? ] unit-test
[ f ] [ V int-regs 2 V int-regs 3 interferes? ] unit-test
[ f ] [ V int-regs 3 V int-regs 2 interferes? ] unit-test
[ t ] [ V int-regs 0 V int-regs 2 interferes? ] unit-test
[ t ] [ V int-regs 2 V int-regs 0 interferes? ] unit-test
[ f ] [ V int-regs 1 V int-regs 3 interferes? ] unit-test
[ f ] [ V int-regs 3 V int-regs 1 interferes? ] unit-test
[ t ] [ V int-regs 3 V int-regs 4 interferes? ] unit-test
[ t ] [ V int-regs 4 V int-regs 3 interferes? ] unit-test
[ t ] [ V int-regs 3 V int-regs 5 interferes? ] unit-test
[ t ] [ V int-regs 5 V int-regs 3 interferes? ] unit-test
[ f ] [ V int-regs 3 V int-regs 6 interferes? ] unit-test
[ f ] [ V int-regs 6 V int-regs 3 interferes? ] unit-test

View File

@ -7,19 +7,22 @@ IN: compiler.cfg.ssa.destruction.interference
<PRIVATE
: kill-after-def? ( vreg1 vreg2 bb -- ? )
:: kill-after-def? ( vreg1 vreg2 bb -- ? )
! If first register is used after second one is defined, they interfere.
! If they are used in the same instruction, no interference. If the
! instruction is a def-is-use-insn, then there will be a use at +1
! (instructions are 2 apart) and so outputs will interfere with
! inputs.
[ kill-index ] [ def-index ] bi-curry bi* > ;
vreg1 bb kill-index
vreg2 bb def-index > ;
: interferes-same-block? ( vreg1 vreg2 bb1 bb2 -- ? )
:: interferes-same-block? ( vreg1 vreg2 bb1 bb2 -- ? )
! If both are defined in the same basic block, they interfere if their
! local live ranges intersect.
drop
{ [ kill-after-def? ] [ swapd kill-after-def? ] } 3|| ;
vreg1 bb1 def-index
vreg2 bb1 def-index <
[ vreg1 vreg2 ] [ vreg2 vreg1 ] if
bb1 kill-after-def? ;
: interferes-first-dominates? ( vreg1 vreg2 bb1 bb2 -- ? )
! If vreg1 dominates vreg2, then they interfere if vreg2's definition