2008-09-15 02:54:48 -04:00
|
|
|
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
|
2008-10-09 00:42:53 -04:00
|
|
|
cpu.architecture
|
|
|
|
compiler.cfg.instructions
|
2008-09-15 02:54:48 -04:00
|
|
|
compiler.cfg.registers
|
2008-09-17 01:46:38 -04:00
|
|
|
compiler.cfg.linear-scan
|
2008-09-15 02:54:48 -04:00
|
|
|
compiler.cfg.linear-scan.live-intervals
|
2008-10-19 02:10:21 -04:00
|
|
|
compiler.cfg.linear-scan.allocation
|
2008-09-15 02:54:48 -04:00
|
|
|
compiler.cfg.linear-scan.debugger ;
|
|
|
|
|
2008-10-19 02:10:21 -04:00
|
|
|
[ 7 ] [
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 2 } } }
|
|
|
|
{ start 0 }
|
|
|
|
{ end 10 }
|
|
|
|
{ uses V{ 0 1 3 7 10 } }
|
|
|
|
}
|
|
|
|
4 [ >= ] find-use nip
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
[ 4 ] [
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 2 } } }
|
|
|
|
{ start 0 }
|
|
|
|
{ end 10 }
|
|
|
|
{ uses V{ 0 1 3 4 10 } }
|
|
|
|
}
|
|
|
|
4 [ >= ] find-use nip
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
[ f ] [
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 2 } } }
|
|
|
|
{ start 0 }
|
|
|
|
{ end 10 }
|
|
|
|
{ uses V{ 0 1 3 4 10 } }
|
|
|
|
}
|
|
|
|
100 [ >= ] find-use nip
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
[
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 0 }
|
|
|
|
{ end 1 }
|
|
|
|
{ uses V{ 0 1 } }
|
|
|
|
}
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 5 }
|
|
|
|
{ end 5 }
|
|
|
|
{ uses V{ 5 } }
|
|
|
|
}
|
|
|
|
] [
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 0 }
|
|
|
|
{ end 5 }
|
|
|
|
{ uses V{ 0 1 5 } }
|
|
|
|
} 2 split-interval
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
[
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 0 }
|
|
|
|
{ end 0 }
|
|
|
|
{ uses V{ 0 } }
|
|
|
|
}
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 1 }
|
|
|
|
{ end 5 }
|
|
|
|
{ uses V{ 1 5 } }
|
|
|
|
}
|
|
|
|
] [
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 0 }
|
|
|
|
{ end 5 }
|
|
|
|
{ uses V{ 0 1 5 } }
|
|
|
|
} 0 split-interval
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
[
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 3 }
|
|
|
|
{ end 10 }
|
|
|
|
{ uses V{ 3 10 } }
|
|
|
|
}
|
|
|
|
] [
|
|
|
|
{
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 1 }
|
|
|
|
{ end 15 }
|
|
|
|
{ uses V{ 1 3 7 10 15 } }
|
|
|
|
}
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 3 }
|
|
|
|
{ end 8 }
|
|
|
|
{ uses V{ 3 4 8 } }
|
|
|
|
}
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 3 }
|
|
|
|
{ end 10 }
|
|
|
|
{ uses V{ 3 10 } }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 5 }
|
|
|
|
{ end 5 }
|
|
|
|
{ uses V{ 5 } }
|
|
|
|
}
|
|
|
|
interval-to-spill
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
[ t ] [
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 5 }
|
|
|
|
{ end 15 }
|
|
|
|
{ uses V{ 5 10 15 } }
|
|
|
|
}
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 1 }
|
|
|
|
{ end 20 }
|
|
|
|
{ uses V{ 1 20 } }
|
|
|
|
}
|
|
|
|
spill-existing?
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
[ f ] [
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 5 }
|
|
|
|
{ end 15 }
|
|
|
|
{ uses V{ 5 10 15 } }
|
|
|
|
}
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 1 }
|
|
|
|
{ end 20 }
|
|
|
|
{ uses V{ 1 7 20 } }
|
|
|
|
}
|
|
|
|
spill-existing?
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
[ t ] [
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 5 }
|
|
|
|
{ end 5 }
|
|
|
|
{ uses V{ 5 } }
|
|
|
|
}
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 1 }
|
|
|
|
{ end 20 }
|
|
|
|
{ uses V{ 1 7 20 } }
|
|
|
|
}
|
|
|
|
spill-existing?
|
|
|
|
] unit-test
|
|
|
|
|
2008-09-15 02:54:48 -04:00
|
|
|
[ ] [
|
|
|
|
{
|
2008-10-19 02:10:21 -04:00
|
|
|
T{ live-interval { vreg T{ vreg { n 1 } { reg-class int-regs } } } { start 0 } { end 100 } { uses V{ 0 100 } } }
|
2008-09-15 02:54:48 -04:00
|
|
|
}
|
2008-10-19 02:10:21 -04:00
|
|
|
H{ { int-regs { "A" } } }
|
2008-09-15 02:54:48 -04:00
|
|
|
check-linear-scan
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
[ ] [
|
|
|
|
{
|
2008-10-19 02:10:21 -04:00
|
|
|
T{ live-interval { vreg T{ vreg { n 1 } { reg-class int-regs } } } { start 0 } { end 10 } { uses V{ 0 10 } } }
|
|
|
|
T{ live-interval { vreg T{ vreg { n 2 } { reg-class int-regs } } } { start 11 } { end 20 } { uses V{ 11 20 } } }
|
2008-09-15 02:54:48 -04:00
|
|
|
}
|
2008-10-19 02:10:21 -04:00
|
|
|
H{ { int-regs { "A" } } }
|
2008-09-15 02:54:48 -04:00
|
|
|
check-linear-scan
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
[ ] [
|
|
|
|
{
|
2008-10-19 02:10:21 -04:00
|
|
|
T{ live-interval { vreg T{ vreg { n 1 } { reg-class int-regs } } } { start 0 } { end 100 } { uses V{ 0 100 } } }
|
|
|
|
T{ live-interval { vreg T{ vreg { n 2 } { reg-class int-regs } } } { start 30 } { end 60 } { uses V{ 30 60 } } }
|
2008-09-15 02:54:48 -04:00
|
|
|
}
|
2008-10-19 02:10:21 -04:00
|
|
|
H{ { int-regs { "A" } } }
|
2008-09-15 02:54:48 -04:00
|
|
|
check-linear-scan
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
[ ] [
|
|
|
|
{
|
2008-10-19 02:10:21 -04:00
|
|
|
T{ live-interval { vreg T{ vreg { n 1 } { reg-class int-regs } } } { start 0 } { end 100 } { uses V{ 0 100 } } }
|
|
|
|
T{ live-interval { vreg T{ vreg { n 2 } { reg-class int-regs } } } { start 30 } { end 200 } { uses V{ 30 200 } } }
|
2008-09-15 02:54:48 -04:00
|
|
|
}
|
2008-10-19 02:10:21 -04:00
|
|
|
H{ { int-regs { "A" } } }
|
2008-09-15 02:54:48 -04:00
|
|
|
check-linear-scan
|
|
|
|
] unit-test
|
|
|
|
|
|
|
|
[
|
|
|
|
{
|
2008-10-19 02:10:21 -04:00
|
|
|
T{ live-interval { vreg T{ vreg { n 1 } { reg-class int-regs } } } { start 0 } { end 100 } { uses V{ 0 100 } } }
|
|
|
|
T{ live-interval { vreg T{ vreg { n 2 } { reg-class int-regs } } } { start 30 } { end 100 } { uses V{ 30 100 } } }
|
2008-09-15 02:54:48 -04:00
|
|
|
}
|
2008-10-19 02:10:21 -04:00
|
|
|
H{ { int-regs { "A" } } }
|
2008-09-15 02:54:48 -04:00
|
|
|
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
|
2008-10-19 02:10:21 -04:00
|
|
|
swap int-regs swap vreg boa >>vreg
|
2008-09-15 02:54:48 -04:00
|
|
|
max-uses get random 2 max [ not-taken ] replicate natural-sort
|
2008-10-19 02:10:21 -04:00
|
|
|
[ >>uses ] [ first >>start ] bi
|
|
|
|
dup uses>> peek >>end
|
2008-09-15 02:54:48 -04:00
|
|
|
] map
|
|
|
|
] with-scope ;
|
|
|
|
|
|
|
|
: random-test ( num-intervals max-uses max-registers max-insns -- )
|
2008-10-19 02:10:21 -04:00
|
|
|
over >r random-live-intervals r> int-regs associate check-linear-scan ;
|
2008-09-15 02:54:48 -04:00
|
|
|
|
|
|
|
[ ] [ 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
|
2008-09-17 01:46:38 -04:00
|
|
|
|
|
|
|
USING: math.private compiler.cfg.debugger ;
|
|
|
|
|
|
|
|
[ ] [ [ float+ float>fixnum 3 fixnum*fast ] test-mr first linear-scan drop ] unit-test
|
2008-10-09 00:42:53 -04:00
|
|
|
|
|
|
|
[ f ] [
|
|
|
|
T{ ##allot
|
|
|
|
f
|
|
|
|
T{ vreg f int-regs 1 }
|
|
|
|
40
|
|
|
|
array
|
|
|
|
T{ vreg f int-regs 2 }
|
|
|
|
f
|
|
|
|
} clone
|
|
|
|
1array (linear-scan) first regs>> values all-equal?
|
|
|
|
] unit-test
|
2008-10-19 02:10:21 -04:00
|
|
|
|
|
|
|
[ 0 1 ] [
|
|
|
|
{
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 1 } } }
|
|
|
|
{ start 0 }
|
|
|
|
{ end 5 }
|
|
|
|
{ uses V{ 0 1 5 } }
|
|
|
|
}
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 2 } } }
|
|
|
|
{ start 3 }
|
|
|
|
{ end 4 }
|
|
|
|
{ uses V{ 3 4 } }
|
|
|
|
}
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg T{ vreg { reg-class int-regs } { n 3 } } }
|
|
|
|
{ start 2 }
|
|
|
|
{ end 6 }
|
|
|
|
{ uses V{ 2 4 6 } }
|
|
|
|
}
|
|
|
|
} [ clone ] map
|
|
|
|
H{ { int-regs { "A" "B" } } }
|
|
|
|
allocate-registers
|
|
|
|
first split-before>> [ start>> ] [ end>> ] bi
|
|
|
|
] unit-test
|
2008-11-02 02:49:57 -05:00
|
|
|
|
|
|
|
! Coalescing interacted badly with splitting
|
|
|
|
[ ] [
|
|
|
|
{
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg V int-regs 70 }
|
|
|
|
{ start 14 }
|
|
|
|
{ end 17 }
|
|
|
|
{ uses V{ 14 15 16 17 } }
|
|
|
|
{ copy-from V int-regs 67 }
|
|
|
|
}
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg V int-regs 67 }
|
|
|
|
{ start 13 }
|
|
|
|
{ end 14 }
|
|
|
|
{ uses V{ 13 14 } }
|
|
|
|
}
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg V int-regs 30 }
|
|
|
|
{ start 4 }
|
|
|
|
{ end 18 }
|
|
|
|
{ uses V{ 4 12 16 17 18 } }
|
|
|
|
}
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg V int-regs 27 }
|
|
|
|
{ start 3 }
|
|
|
|
{ end 13 }
|
|
|
|
{ uses V{ 3 7 13 } }
|
|
|
|
}
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg V int-regs 59 }
|
|
|
|
{ start 10 }
|
|
|
|
{ end 18 }
|
|
|
|
{ uses V{ 10 11 12 18 } }
|
|
|
|
{ copy-from V int-regs 56 }
|
|
|
|
}
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg V int-regs 60 }
|
|
|
|
{ start 12 }
|
|
|
|
{ end 17 }
|
|
|
|
{ uses V{ 12 17 } }
|
|
|
|
}
|
|
|
|
T{ live-interval
|
|
|
|
{ vreg V int-regs 56 }
|
|
|
|
{ start 9 }
|
|
|
|
{ end 10 }
|
|
|
|
{ uses V{ 9 10 } }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
{ { int-regs { 0 1 2 3 } } }
|
2008-11-03 02:53:27 -05:00
|
|
|
allocate-registers drop
|
2008-11-02 02:49:57 -05:00
|
|
|
] unit-test
|