: interval-[30,46] ( -- live-interval )
T{ live-interval-state
{ vreg 49 }
- { ranges { { 30 46 } } }
+ { ranges V{ { 30 46 } } }
{ uses
- {
+ V{
T{ vreg-use { n 30 } { def-rep double-rep } }
T{ vreg-use { n 46 } { use-rep double-rep } }
}
: interval-[30,60] ( -- live-interval )
T{ live-interval-state
{ vreg 25 }
- { ranges { { 30 60 } } }
+ { ranges V{ { 30 60 } } }
{ reg RAX }
} ;
{ int-regs V{
T{ live-interval-state
{ vreg 1 }
- { ranges { { 30 40 } } }
+ { ranges V{ { 30 40 } } }
{ uses
- { T{ vreg-use { n 32 } { def-rep double-rep } } }
+ V{ T{ vreg-use { n 32 } { def-rep double-rep } } }
}
}
T{ live-interval-state
{ vreg 50 }
- { ranges { { 5 10 } } }
+ { ranges V{ { 5 10 } } }
{ uses
- { T{ vreg-use { n 8 } { def-rep double-rep } } }
+ V{ T{ vreg-use { n 8 } { def-rep double-rep } } }
}
}
} }
{ vreg 45 }
{ spill-to T{ spill-slot { n 8 } } }
{ spill-rep double-rep }
- { ranges { { 22 47 } { 67 68 } { 69 72 } } }
+ { ranges V{ { 22 47 } { 67 68 } { 69 72 } } }
{ uses
- {
+ V{
T{ vreg-use
{ n 28 }
{ use-rep double-rep }
! trim-after-ranges
{
T{ live-interval-state
- { ranges { { 25 30 } { 40 50 } } }
- { uses { T{ vreg-use { n 25 } } } }
+ { ranges V{ { 25 30 } { 40 50 } } }
+ { uses V{ T{ vreg-use { n 25 } } } }
}
} [
T{ live-interval-state
- { ranges { { 0 10 } { 20 30 } { 40 50 } } }
- { uses { T{ vreg-use { n 25 } } } }
+ { ranges V{ { 0 10 } { 20 30 } { 40 50 } } }
+ { uses V{ T{ vreg-use { n 25 } } } }
} dup trim-after-ranges
] unit-test
{
T{ live-interval-state
- { ranges { { 10 23 } } }
- { uses { T{ vreg-use { n 10 } } } }
+ { ranges V{ { 10 23 } } }
+ { uses V{ T{ vreg-use { n 10 } } } }
}
} [
T{ live-interval-state
- { ranges { { 20 23 } } }
- { uses { T{ vreg-use { n 10 } } } }
+ { ranges V{ { 20 23 } } }
+ { uses V{ T{ vreg-use { n 10 } } } }
}
dup trim-after-ranges
] unit-test
! trim-before-ranges
{
T{ live-interval-state
- { ranges { { 0 10 } { 20 21 } } }
- { uses { T{ vreg-use { n 20 } } } }
+ { ranges V{ { 0 10 } { 20 21 } } }
+ { uses V{ T{ vreg-use { n 20 } } } }
}
} [
T{ live-interval-state
- { ranges { { 0 10 } { 20 30 } { 40 50 } } }
- { uses { T{ vreg-use { n 20 } } } }
+ { ranges V{ { 0 10 } { 20 30 } { 40 50 } } }
+ { uses V{ T{ vreg-use { n 20 } } } }
} dup trim-before-ranges
] unit-test
USING: accessors assocs combinators
compiler.cfg.linear-scan.allocation.splitting
compiler.cfg.linear-scan.allocation.state
-compiler.cfg.linear-scan.live-intervals compiler.cfg.linear-scan.ranges
-compiler.cfg.registers compiler.utilities fry kernel linked-assocs locals
-math namespaces sequences ;
+compiler.cfg.linear-scan.live-intervals
+compiler.cfg.linear-scan.ranges compiler.utilities fry kernel
+linked-assocs locals math namespaces sequences ;
IN: compiler.cfg.linear-scan.allocation.spilling
: trim-before-ranges ( live-interval -- )
: test-interval-easy ( -- interval )
T{ live-interval-state
- { ranges { { 5 8 } { 12 20 } } }
+ { ranges V{ { 5 8 } { 12 20 } } }
{ uses
- {
+ V{
T{ vreg-use { n 3 } { def-rep int-rep } }
T{ vreg-use { n 15 } { def-rep int-rep } }
}
! split-interval
{
T{ live-interval-state
- { ranges { { 5 8 } } }
- { uses { T{ vreg-use { n 3 } { def-rep int-rep } } } }
+ { ranges V{ { 5 8 } } }
+ { uses V{ T{ vreg-use { n 3 } { def-rep int-rep } } } }
}
T{ live-interval-state
- { ranges { { 12 20 } } }
- { uses { T{ vreg-use { n 15 } { def-rep int-rep } } } }
+ { ranges V{ { 12 20 } } }
+ { uses V{ T{ vreg-use { n 15 } { def-rep int-rep } } } }
}
} [
test-interval-easy 10 split-interval
40 progress set
T{ live-interval-state
{ vreg 123 }
- { ranges { { 0 0 } { 30 34 } } }
+ { ranges V{ { 0 0 } { 30 34 } } }
}
check-handled
] unit-test
{ { 0 34 123 } } [
T{ live-interval-state
{ vreg 123 }
- { ranges { { 0 0 } { 30 34 } } }
+ { ranges V{ { 0 0 } { 30 34 } } }
} interval/sync-point-key
] unit-test
{ { 5 1/0. 1/0. } T{ sync-point { n 5 } } }
{
{ 20 28 f }
- T{ live-interval-state { ranges { { 20 28 } } } }
+ T{ live-interval-state { ranges V{ { 20 28 } } } }
}
{
{ 20 30 f }
- T{ live-interval-state { ranges { { 20 30 } } } }
+ T{ live-interval-state { ranges V{ { 20 30 } } } }
}
{
{ 33 999 f }
- T{ live-interval-state { ranges { { 33 999 } } } }
+ T{ live-interval-state { ranges V{ { 33 999 } } } }
}
{ { 33 1/0. 1/0. } T{ sync-point { n 33 } } }
{ { 100 1/0. 1/0. } T{ sync-point { n 100 } } }
}
} [
{
- T{ live-interval-state { ranges { { 20 30 } } } }
- T{ live-interval-state { ranges { { 20 28 } } } }
- T{ live-interval-state { ranges { { 33 999 } } } }
+ T{ live-interval-state { ranges V{ { 20 30 } } } }
+ T{ live-interval-state { ranges V{ { 20 28 } } } }
+ T{ live-interval-state { ranges V{ { 33 999 } } } }
T{ sync-point { n 5 } }
T{ sync-point { n 33 } }
T{ sync-point { n 100 } }
{ 2 } [
{
- T{ live-interval-state { ranges { { 20 30 } } } }
- T{ live-interval-state { ranges { { 20 30 } } } }
+ T{ live-interval-state { ranges V{ { 20 30 } } } }
+ T{ live-interval-state { ranges V{ { 20 30 } } } }
} >unhandled-min-heap heap-size
] unit-test
T{ live-interval-state
{ vreg 1 }
{ reg 1 }
- { ranges { { 1 15 } } }
+ { ranges V{ { 1 15 } } }
{ uses
V{
T{ vreg-use f 1 int-rep f }
T{ live-interval-state
{ vreg 2 }
{ reg 2 }
- { ranges { { 3 8 } } }
+ { ranges V{ { 3 8 } } }
{ uses
V{
T{ vreg-use f 3 int-rep f }
T{ live-interval-state
{ vreg 3 }
{ reg 3 }
- { ranges { { 3 10 } } }
+ { ranges V{ { 3 10 } } }
{ uses V{ T{ vreg-use f 3 int-rep f } T{ vreg-use f 10 f int-rep } } }
}
}
H{ } inactive-intervals set
T{ live-interval-state
{ vreg 1 }
- { ranges { { 5 5 } } }
+ { ranges V{ { 5 5 } } }
{ uses V{ T{ vreg-use f 5 int-rep f } } }
}
spill-status
T{ live-interval-state
{ vreg 1 }
{ reg 1 }
- { ranges { { 1 15 } } }
+ { ranges V{ { 1 15 } } }
{ uses V{ T{ vreg-use f 1 int-rep f } } }
}
T{ live-interval-state
H{ } inactive-intervals set
T{ live-interval-state
{ vreg 3 }
- { ranges { { 5 5 } } }
+ { ranges V{ { 5 5 } } }
{ uses V{ T{ vreg-use f 5 int-rep f } } }
}
spill-status
25 T{ live-interval-state { uses V{ T{ vreg-use { n 25 } } } } } find-use
] unit-test
+! finish-live-interval
+{
+ V{ { 5 10 } { 21 30 } }
+} [
+ { { 21 30 } { 5 10 } } <live-interval-for-ranges>
+ dup finish-live-interval ranges>>
+] unit-test
+
! intervals-intersect?
{ t f f } [
{ { 4 20 } } <live-interval-for-ranges>
] unit-test
! record-def
-{ } [
- H{ { 37 37 } } leader-map set H{ { 37 int-rep } } representations set
+{
+ T{ live-interval-state
+ { vreg 37 }
+ { ranges V{ { 20 20 } } }
+ { uses V{ T{ vreg-use { n 20 } { def-rep int-rep } } } }
+ }
+} [
+ H{ { 37 37 } } leader-map set
+ H{ { 37 int-rep } } representations set
+ 37 20 f record-def
+ 37 vreg>live-interval
] unit-test
TUPLE: live-interval-state
vreg
reg spill-to spill-rep reload-from reload-rep
- ranges uses ;
+ { ranges vector } { uses vector } ;
: first-use ( live-interval -- use ) uses>> first ; inline
: check-start ( live-interval -- )
dup live-interval-start -1 = [ bad-live-interval ] [ drop ] if ;
+: finish-live-interval ( live-interval -- )
+ [ ranges>> reverse! drop ] [ uses>> reverse! drop ] [ check-start ] tri ;
+
: finish-live-intervals ( live-intervals -- )
- [
- {
- [ [ { } like reverse! ] change-ranges drop ]
- [ [ { } like reverse! ] change-uses drop ]
- [ check-start ]
- } cleave
- ] each ;
+ [ finish-live-interval ] each ;
TUPLE: sync-point n keep-dst? ;