[ cfg set ] [ number-instructions ] [ compute-live-intervals ] tri
drop ;
-{ } [
+[ ] [
H{
{ 1 int-rep }
} representations set
test-live-intervals
] unit-test
-{ 0 0 } [
+[ 0 0 ] [
1 live-intervals get at [ start>> ] [ end>> ] bi
] unit-test
! Live range and interval splitting
-{
+[
{ T{ live-range f 1 10 } T{ live-range f 15 15 } }
{ T{ live-range f 16 20 } }
-} [
+] [
{
T{ live-range f 1 10 }
T{ live-range f 15 20 }
} 15 split-ranges
] unit-test
-{
+[
{ T{ live-range f 1 10 } T{ live-range f 15 16 } }
{ T{ live-range f 17 20 } }
-} [
+] [
{
T{ live-range f 1 10 }
T{ live-range f 15 20 }
} 16 split-ranges
] unit-test
-{
+[
{ T{ live-range f 1 10 } }
{ T{ live-range f 15 20 } }
-} [
+] [
{
T{ live-range f 1 10 }
T{ live-range f 15 20 }
} 12 split-ranges
] unit-test
-{
+[
{ T{ live-range f 1 10 } T{ live-range f 15 17 } }
{ T{ live-range f 18 20 } }
-} [
+] [
{
T{ live-range f 1 10 }
T{ live-range f 15 20 }
{ T{ live-range f 1 10 } } 0 split-ranges
] must-fail
-{
+[
{ T{ live-range f 0 0 } }
{ T{ live-range f 1 5 } }
-} [
+] [
{ T{ live-range f 0 5 } } 0 split-ranges
] unit-test
: clean-up-split ( a b -- a b )
[ dup [ [ >vector ] change-uses [ >vector ] change-ranges ] when ] bi@ ;
-{
+[
T{ live-interval-state
{ vreg 1 }
{ reg-class float-regs }
{ reload-from T{ spill-slot f 0 } }
{ reload-rep float-rep }
}
-} [
+] [
T{ live-interval-state
{ vreg 1 }
{ reg-class float-regs }
clean-up-split
] unit-test
-{
+[
f
T{ live-interval-state
{ vreg 2 }
{ reload-from T{ spill-slot f 4 } }
{ reload-rep float-rep }
}
-} [
+] [
T{ live-interval-state
{ vreg 2 }
{ reg-class float-regs }
clean-up-split
] unit-test
-{
+[
T{ live-interval-state
{ vreg 3 }
{ reg-class float-regs }
{ spill-rep float-rep }
}
f
-} [
+] [
T{ live-interval-state
{ vreg 3 }
{ reg-class float-regs }
clean-up-split
] unit-test
-{
+[
T{ live-interval-state
{ vreg 4 }
{ reg-class float-regs }
{ reload-from T{ spill-slot f 12 } }
{ reload-rep float-rep }
}
-} [
+] [
T{ live-interval-state
{ vreg 4 }
{ reg-class float-regs }
] unit-test
! Don't insert reload if first usage is a def
-{
+[
T{ live-interval-state
{ vreg 5 }
{ reg-class float-regs }
{ uses V{ T{ vreg-use f 20 float-rep f } T{ vreg-use f 30 f float-rep } } }
{ ranges V{ T{ live-range f 20 30 } } }
}
-} [
+] [
T{ live-interval-state
{ vreg 5 }
{ reg-class float-regs }
] unit-test
! Multiple representations
-{
+[
T{ live-interval-state
{ vreg 6 }
{ reg-class float-regs }
{ reload-from T{ spill-slot f 24 } }
{ reload-rep double-rep }
}
-} [
+] [
T{ live-interval-state
{ vreg 6 }
{ reg-class float-regs }
clean-up-split
] unit-test
-{
+[
f
T{ live-interval-state
{ vreg 7 }
{ uses V{ T{ vreg-use f 8 int-rep } } }
{ reg-class int-regs }
}
-} [
+] [
T{ live-interval-state
{ vreg 7 }
{ start 4 }
] unit-test
! trim-before-ranges, trim-after-ranges
-{
+[
T{ live-interval-state
{ vreg 8 }
{ start 0 }
{ reload-from T{ spill-slot f 32 } }
{ reload-rep int-rep }
}
-} [
+] [
T{ live-interval-state
{ vreg 8 }
{ start 0 }
{ 3 int-rep }
} representations set
-{
+[
{
3
10
}
-} [
+] [
H{
{ int-regs
V{
spill-status
] unit-test
-{
+[
{
1
1/0.
}
-} [
+] [
H{
{ int-regs
V{
H{ { 1 int-rep } { 2 int-rep } } representations set
-{ } [
+[ ] [
{
T{ live-interval-state
{ vreg 1 }
check-linear-scan
] unit-test
-{ } [
+[ ] [
{
T{ live-interval-state
{ vreg 1 }
check-linear-scan
] unit-test
-{ } [
+[ ] [
{
T{ live-interval-state
{ vreg 1 }
check-linear-scan
] unit-test
-{ } [
+[ ] [
{
T{ live-interval-state
{ vreg 1 }
{ 5 int-rep }
} representations set
-{ } [
+[ ] [
{
T{ live-interval-state
{ vreg 1 }
! Test spill-new code path
-{ } [
+[ ] [
{
T{ live-interval-state
{ vreg 1 }
check-linear-scan
] unit-test
-{ f } [
+[ f ] [
T{ live-range f 0 10 }
T{ live-range f 20 30 }
intersect-live-range
] unit-test
-{ 10 } [
+[ 10 ] [
T{ live-range f 0 10 }
T{ live-range f 10 30 }
intersect-live-range
] unit-test
-{ 5 } [
+[ 5 ] [
T{ live-range f 0 10 }
T{ live-range f 5 30 }
intersect-live-range
] unit-test
-{ 5 } [
+[ 5 ] [
T{ live-range f 5 30 }
T{ live-range f 0 10 }
intersect-live-range
] unit-test
-{ 5 } [
+[ 5 ] [
T{ live-range f 5 10 }
T{ live-range f 0 15 }
intersect-live-range
] unit-test
-{ 50 } [
+[ 50 ] [
{
T{ live-range f 0 10 }
T{ live-range f 20 30 }
intersect-live-ranges
] unit-test
-{ f } [
+[ f ] [
{
T{ live-range f 0 10 }
T{ live-range f 20 30 }
intersect-live-ranges
] unit-test
-{ 5 } [
+[ 5 ] [
T{ live-interval-state
{ start 0 }
{ reg-class int-regs }
{ 4 int-rep }
} representations set
-{ { 0 10 } } [
+[ { 0 10 } ] [
H{
{ int-regs
{