106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Factor
		
	
	
IN: compiler.cfg.linear-scan.tests
 | 
						|
USING: tools.test random sorting sequences sets hashtables assocs
 | 
						|
kernel fry arrays splitting namespaces math accessors vectors
 | 
						|
math.order
 | 
						|
compiler.cfg.registers
 | 
						|
compiler.cfg.linear-scan
 | 
						|
compiler.cfg.linear-scan.live-intervals
 | 
						|
compiler.cfg.linear-scan.debugger ;
 | 
						|
 | 
						|
[ ] [
 | 
						|
    {
 | 
						|
        T{ live-interval { vreg T{ vreg { n 1 } } } { start 0 } { end 100 } { uses V{ 100 } } }
 | 
						|
    }
 | 
						|
    H{ { f { "A" } } }
 | 
						|
    check-linear-scan
 | 
						|
] unit-test
 | 
						|
 | 
						|
[ ] [
 | 
						|
    {
 | 
						|
        T{ live-interval { vreg T{ vreg { n 1 } } } { start 0 } { end 10 } { uses V{ 10 } } }
 | 
						|
        T{ live-interval { vreg T{ vreg { n 2 } } } { start 11 } { end 20 } { uses V{ 20 } } }
 | 
						|
    }
 | 
						|
    H{ { f { "A" } } }
 | 
						|
    check-linear-scan
 | 
						|
] unit-test
 | 
						|
 | 
						|
[ ] [
 | 
						|
    {
 | 
						|
        T{ live-interval { vreg T{ vreg { n 1 } } } { start 0 } { end 100 } { uses V{ 100 } } }
 | 
						|
        T{ live-interval { vreg T{ vreg { n 2 } } } { start 30 } { end 60 } { uses V{ 60 } } }
 | 
						|
    }
 | 
						|
    H{ { f { "A" } } }
 | 
						|
    check-linear-scan
 | 
						|
] unit-test
 | 
						|
 | 
						|
[ ] [
 | 
						|
    {
 | 
						|
        T{ live-interval { vreg T{ vreg { n 1 } } } { start 0 } { end 100 } { uses V{ 100 } } }
 | 
						|
        T{ live-interval { vreg T{ vreg { n 2 } } } { start 30 } { end 200 } { uses V{ 200 } } }
 | 
						|
    }
 | 
						|
    H{ { f { "A" } } }
 | 
						|
    check-linear-scan
 | 
						|
] unit-test
 | 
						|
 | 
						|
[
 | 
						|
    {
 | 
						|
        T{ live-interval { vreg T{ vreg { n 1 } } } { start 0 } { end 100 } { uses V{ 100 } } }
 | 
						|
        T{ live-interval { vreg T{ vreg { n 2 } } } { start 30 } { end 100 } { uses V{ 100 } } }
 | 
						|
    }
 | 
						|
    H{ { f { "A" } } }
 | 
						|
    check-linear-scan
 | 
						|
] must-fail
 | 
						|
 | 
						|
SYMBOL: available
 | 
						|
 | 
						|
SYMBOL: taken
 | 
						|
 | 
						|
SYMBOL: max-registers
 | 
						|
 | 
						|
SYMBOL: max-insns
 | 
						|
 | 
						|
SYMBOL: max-uses
 | 
						|
 | 
						|
: not-taken ( -- n )
 | 
						|
    available get keys dup empty? [ "Oops" throw ] when
 | 
						|
    random
 | 
						|
    dup taken get nth 1 + max-registers get = [
 | 
						|
        dup available get delete-at
 | 
						|
    ] [
 | 
						|
        dup taken get [ 1 + ] change-nth
 | 
						|
    ] if ;
 | 
						|
 | 
						|
: random-live-intervals ( num-intervals max-uses max-registers max-insns -- seq )
 | 
						|
    [
 | 
						|
        max-insns set
 | 
						|
        max-registers set
 | 
						|
        max-uses set
 | 
						|
        max-insns get [ 0 ] replicate taken set
 | 
						|
        max-insns get [ dup ] H{ } map>assoc available set
 | 
						|
        [
 | 
						|
            live-interval new
 | 
						|
                swap f swap vreg boa >>vreg
 | 
						|
                max-uses get random 2 max [ not-taken ] replicate natural-sort
 | 
						|
                unclip [ >vector >>uses ] [ >>start ] bi*
 | 
						|
                dup uses>> first >>end
 | 
						|
        ] map
 | 
						|
    ] with-scope ;
 | 
						|
 | 
						|
: random-test ( num-intervals max-uses max-registers max-insns -- )
 | 
						|
    over >r random-live-intervals r> f associate check-linear-scan ;
 | 
						|
 | 
						|
[ ] [ 30 2 1 60 random-test ] unit-test
 | 
						|
[ ] [ 60 2 2 60 random-test ] unit-test
 | 
						|
[ ] [ 80 2 3 200 random-test ] unit-test
 | 
						|
[ ] [ 70 2 5 30 random-test ] unit-test
 | 
						|
[ ] [ 60 2 6 30 random-test ] unit-test
 | 
						|
[ ] [ 1 2 10 10 random-test ] unit-test
 | 
						|
 | 
						|
[ ] [ 10 4 2 60 random-test ] unit-test
 | 
						|
[ ] [ 10 20 2 400 random-test ] unit-test
 | 
						|
[ ] [ 10 20 4 300 random-test ] unit-test
 | 
						|
 | 
						|
USING: math.private compiler.cfg.debugger ;
 | 
						|
 | 
						|
[ ] [ [ float+ float>fixnum 3 fixnum*fast ] test-mr first linear-scan drop ] unit-test
 |