compiler.cfg.linear-scan.resolve: More fixes
							parent
							
								
									da13681bc8
								
							
						
					
					
						commit
						c00af97fa1
					
				| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
! Copyright (C) 2008, 2009 Slava Pestov.
 | 
			
		||||
! See http://factorcode.org/license.txt for BSD license.
 | 
			
		||||
USING: accessors kernel math assocs namespaces sequences heaps
 | 
			
		||||
fry make combinators sets
 | 
			
		||||
fry make combinators sets locals
 | 
			
		||||
cpu.architecture
 | 
			
		||||
compiler.cfg.def-use
 | 
			
		||||
compiler.cfg.registers
 | 
			
		||||
| 
						 | 
				
			
			@ -116,8 +116,8 @@ ERROR: already-reloaded ;
 | 
			
		|||
        ] [ 2drop ] if
 | 
			
		||||
    ] if ;
 | 
			
		||||
 | 
			
		||||
: prepare-insn ( insn -- )
 | 
			
		||||
    insn#>> [ expire-old-intervals ] [ activate-new-intervals ] bi ;
 | 
			
		||||
: prepare-insn ( n -- )
 | 
			
		||||
    [ expire-old-intervals ] [ activate-new-intervals ] bi ;
 | 
			
		||||
 | 
			
		||||
GENERIC: assign-registers-in-insn ( insn -- )
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -171,29 +171,33 @@ M: ##gc assign-registers-in-insn
 | 
			
		|||
M: insn assign-registers-in-insn drop ;
 | 
			
		||||
 | 
			
		||||
: begin-block ( bb -- )
 | 
			
		||||
    dup block-from prepare-insn
 | 
			
		||||
    [ block-from compute-live-values ] keep register-live-ins get set-at ;
 | 
			
		||||
 | 
			
		||||
: end-block ( bb -- )
 | 
			
		||||
    [ block-to compute-live-values ] keep register-live-outs get set-at ;
 | 
			
		||||
 | 
			
		||||
: vreg-at-start ( vreg bb -- state ) register-live-ins get at at ;
 | 
			
		||||
ERROR: bad-vreg vreg ;
 | 
			
		||||
 | 
			
		||||
: vreg-at-end ( vreg bb -- state ) register-live-outs get at at ;
 | 
			
		||||
: vreg-at-start ( vreg bb -- state )
 | 
			
		||||
    register-live-ins get at ?at [ bad-vreg ] unless ;
 | 
			
		||||
 | 
			
		||||
: assign-registers-in-block ( bb -- )
 | 
			
		||||
    dup
 | 
			
		||||
    begin-block
 | 
			
		||||
    [
 | 
			
		||||
: vreg-at-end ( vreg bb -- state )
 | 
			
		||||
    register-live-outs get at ?at [ bad-vreg ] unless ;
 | 
			
		||||
 | 
			
		||||
:: assign-registers-in-block ( bb -- )
 | 
			
		||||
    bb [
 | 
			
		||||
        [
 | 
			
		||||
            bb begin-block
 | 
			
		||||
            [
 | 
			
		||||
                [ prepare-insn ]
 | 
			
		||||
                [ insn#>> prepare-insn ]
 | 
			
		||||
                [ assign-registers-in-insn ]
 | 
			
		||||
                [ , ]
 | 
			
		||||
                tri
 | 
			
		||||
            ] each
 | 
			
		||||
            bb end-block
 | 
			
		||||
        ] V{ } make
 | 
			
		||||
    ] change-instructions
 | 
			
		||||
    end-block ;
 | 
			
		||||
    ] change-instructions drop ;
 | 
			
		||||
 | 
			
		||||
: assign-registers ( live-intervals rpo -- )
 | 
			
		||||
    [ init-assignment ] dip
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1910,4 +1910,69 @@ V{
 | 
			
		|||
 | 
			
		||||
[ t ] [ 3 get instructions>> [ _spill? ] any? ] unit-test
 | 
			
		||||
 | 
			
		||||
[ t ] [ 5 get instructions>> [ _reload? ] any? ] unit-test
 | 
			
		||||
[ t ] [ 5 get instructions>> [ _reload? ] any? ] unit-test
 | 
			
		||||
 | 
			
		||||
! A more complicated failure case with resolve that came up after the above
 | 
			
		||||
! got fixed
 | 
			
		||||
V{ T{ ##branch } } 0 test-bb
 | 
			
		||||
V{
 | 
			
		||||
    T{ ##peek f V int-regs 0 D 0 }
 | 
			
		||||
    T{ ##peek f V int-regs 1 D 1 }
 | 
			
		||||
    T{ ##peek f V int-regs 2 D 2 }
 | 
			
		||||
    T{ ##peek f V int-regs 3 D 3 }
 | 
			
		||||
    T{ ##peek f V int-regs 4 D 0 }
 | 
			
		||||
    T{ ##branch }
 | 
			
		||||
} 1 test-bb
 | 
			
		||||
V{ T{ ##branch } } 2 test-bb
 | 
			
		||||
V{ T{ ##branch } } 3 test-bb
 | 
			
		||||
V{
 | 
			
		||||
    
 | 
			
		||||
    T{ ##replace f V int-regs 1 D 1 }
 | 
			
		||||
    T{ ##replace f V int-regs 2 D 2 }
 | 
			
		||||
    T{ ##replace f V int-regs 3 D 3 }
 | 
			
		||||
    T{ ##replace f V int-regs 4 D 4 }
 | 
			
		||||
    T{ ##replace f V int-regs 0 D 0 }
 | 
			
		||||
    T{ ##branch }
 | 
			
		||||
} 4 test-bb
 | 
			
		||||
V{ T{ ##replace f V int-regs 0 D 0 } T{ ##branch } } 5 test-bb
 | 
			
		||||
V{ T{ ##return } } 6 test-bb
 | 
			
		||||
V{ T{ ##branch } } 7 test-bb
 | 
			
		||||
V{
 | 
			
		||||
    T{ ##replace f V int-regs 1 D 1 }
 | 
			
		||||
    T{ ##replace f V int-regs 2 D 2 }
 | 
			
		||||
    T{ ##replace f V int-regs 3 D 3 }
 | 
			
		||||
    T{ ##peek f V int-regs 5 D 1 }
 | 
			
		||||
    T{ ##peek f V int-regs 6 D 2 }
 | 
			
		||||
    T{ ##peek f V int-regs 7 D 3 }
 | 
			
		||||
    T{ ##peek f V int-regs 8 D 4 }
 | 
			
		||||
    T{ ##replace f V int-regs 5 D 1 }
 | 
			
		||||
    T{ ##replace f V int-regs 6 D 2 }
 | 
			
		||||
    T{ ##replace f V int-regs 7 D 3 }
 | 
			
		||||
    T{ ##replace f V int-regs 8 D 4 }
 | 
			
		||||
    T{ ##branch }
 | 
			
		||||
} 8 test-bb
 | 
			
		||||
V{
 | 
			
		||||
    T{ ##replace f V int-regs 1 D 1 }
 | 
			
		||||
    T{ ##replace f V int-regs 2 D 2 }
 | 
			
		||||
    T{ ##replace f V int-regs 3 D 3 }
 | 
			
		||||
    T{ ##return }
 | 
			
		||||
} 9 test-bb
 | 
			
		||||
 | 
			
		||||
0 get 1 get 1vector >>successors drop
 | 
			
		||||
1 get 2 get 7 get V{ } 2sequence >>successors drop
 | 
			
		||||
7 get 8 get 1vector >>successors drop
 | 
			
		||||
8 get 9 get 1vector >>successors drop
 | 
			
		||||
2 get 3 get 5 get V{ } 2sequence >>successors drop
 | 
			
		||||
3 get 4 get 1vector >>successors drop
 | 
			
		||||
4 get 9 get 1vector >>successors drop
 | 
			
		||||
5 get 6 get 1vector >>successors drop
 | 
			
		||||
 | 
			
		||||
[ ] [ { 1 2 3 4 } test-linear-scan-on-cfg ] unit-test
 | 
			
		||||
 | 
			
		||||
[ _spill ] [ 1 get instructions>> second class ] unit-test
 | 
			
		||||
[ _reload ] [ 4 get instructions>> 4 swap nth class ] unit-test
 | 
			
		||||
[ V{ 3 2 1 } ] [ 8 get instructions>> [ _spill? ] filter [ n>> ] map ] unit-test
 | 
			
		||||
[ V{ 3 2 1 } ] [ 9 get instructions>> [ _reload? ] filter [ n>> ] map ] unit-test
 | 
			
		||||
 | 
			
		||||
! Resolve pass should insert this
 | 
			
		||||
[ _reload ] [ 5 get instructions>> first class ] unit-test
 | 
			
		||||
		Loading…
	
		Reference in New Issue