compiler.cfg.ssa.destruction.interference: fix a bug and add unit tests
							parent
							
								
									7ec288b013
								
							
						
					
					
						commit
						87e13db946
					
				| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue