[ 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
{