compiler.cfg.linear.scan.*: makes it so ranges and uses are guaranteed
to be vectors Simplifies the code and makes it a little faster.locals-and-roots
parent
e944ff7fe7
commit
026abb9c38
|
@ -8,9 +8,9 @@ IN: compiler.cfg.linear-scan.allocation.tests
|
||||||
: interval-[30,46] ( -- live-interval )
|
: interval-[30,46] ( -- live-interval )
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ vreg 49 }
|
{ vreg 49 }
|
||||||
{ ranges { { 30 46 } } }
|
{ ranges V{ { 30 46 } } }
|
||||||
{ uses
|
{ uses
|
||||||
{
|
V{
|
||||||
T{ vreg-use { n 30 } { def-rep double-rep } }
|
T{ vreg-use { n 30 } { def-rep double-rep } }
|
||||||
T{ vreg-use { n 46 } { use-rep double-rep } }
|
T{ vreg-use { n 46 } { use-rep double-rep } }
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ IN: compiler.cfg.linear-scan.allocation.tests
|
||||||
: interval-[30,60] ( -- live-interval )
|
: interval-[30,60] ( -- live-interval )
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ vreg 25 }
|
{ vreg 25 }
|
||||||
{ ranges { { 30 60 } } }
|
{ ranges V{ { 30 60 } } }
|
||||||
{ reg RAX }
|
{ reg RAX }
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
@ -76,16 +76,16 @@ cpu x86.64? [
|
||||||
{ int-regs V{
|
{ int-regs V{
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ vreg 1 }
|
{ vreg 1 }
|
||||||
{ ranges { { 30 40 } } }
|
{ ranges V{ { 30 40 } } }
|
||||||
{ uses
|
{ uses
|
||||||
{ T{ vreg-use { n 32 } { def-rep double-rep } } }
|
V{ T{ vreg-use { n 32 } { def-rep double-rep } } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ vreg 50 }
|
{ vreg 50 }
|
||||||
{ ranges { { 5 10 } } }
|
{ ranges V{ { 5 10 } } }
|
||||||
{ uses
|
{ uses
|
||||||
{ T{ vreg-use { n 8 } { def-rep double-rep } } }
|
V{ T{ vreg-use { n 8 } { def-rep double-rep } } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} }
|
} }
|
||||||
|
|
|
@ -11,9 +11,9 @@ IN: compiler.cfg.linear-scan.allocation.spilling.tests
|
||||||
{ vreg 45 }
|
{ vreg 45 }
|
||||||
{ spill-to T{ spill-slot { n 8 } } }
|
{ spill-to T{ spill-slot { n 8 } } }
|
||||||
{ spill-rep double-rep }
|
{ spill-rep double-rep }
|
||||||
{ ranges { { 22 47 } { 67 68 } { 69 72 } } }
|
{ ranges V{ { 22 47 } { 67 68 } { 69 72 } } }
|
||||||
{ uses
|
{ uses
|
||||||
{
|
V{
|
||||||
T{ vreg-use
|
T{ vreg-use
|
||||||
{ n 28 }
|
{ n 28 }
|
||||||
{ use-rep double-rep }
|
{ use-rep double-rep }
|
||||||
|
@ -39,25 +39,25 @@ IN: compiler.cfg.linear-scan.allocation.spilling.tests
|
||||||
! trim-after-ranges
|
! trim-after-ranges
|
||||||
{
|
{
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ ranges { { 25 30 } { 40 50 } } }
|
{ ranges V{ { 25 30 } { 40 50 } } }
|
||||||
{ uses { T{ vreg-use { n 25 } } } }
|
{ uses V{ T{ vreg-use { n 25 } } } }
|
||||||
}
|
}
|
||||||
} [
|
} [
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ ranges { { 0 10 } { 20 30 } { 40 50 } } }
|
{ ranges V{ { 0 10 } { 20 30 } { 40 50 } } }
|
||||||
{ uses { T{ vreg-use { n 25 } } } }
|
{ uses V{ T{ vreg-use { n 25 } } } }
|
||||||
} dup trim-after-ranges
|
} dup trim-after-ranges
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
{
|
{
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ ranges { { 10 23 } } }
|
{ ranges V{ { 10 23 } } }
|
||||||
{ uses { T{ vreg-use { n 10 } } } }
|
{ uses V{ T{ vreg-use { n 10 } } } }
|
||||||
}
|
}
|
||||||
} [
|
} [
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ ranges { { 20 23 } } }
|
{ ranges V{ { 20 23 } } }
|
||||||
{ uses { T{ vreg-use { n 10 } } } }
|
{ uses V{ T{ vreg-use { n 10 } } } }
|
||||||
}
|
}
|
||||||
dup trim-after-ranges
|
dup trim-after-ranges
|
||||||
] unit-test
|
] unit-test
|
||||||
|
@ -65,12 +65,12 @@ IN: compiler.cfg.linear-scan.allocation.spilling.tests
|
||||||
! trim-before-ranges
|
! trim-before-ranges
|
||||||
{
|
{
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ ranges { { 0 10 } { 20 21 } } }
|
{ ranges V{ { 0 10 } { 20 21 } } }
|
||||||
{ uses { T{ vreg-use { n 20 } } } }
|
{ uses V{ T{ vreg-use { n 20 } } } }
|
||||||
}
|
}
|
||||||
} [
|
} [
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ ranges { { 0 10 } { 20 30 } { 40 50 } } }
|
{ ranges V{ { 0 10 } { 20 30 } { 40 50 } } }
|
||||||
{ uses { T{ vreg-use { n 20 } } } }
|
{ uses V{ T{ vreg-use { n 20 } } } }
|
||||||
} dup trim-before-ranges
|
} dup trim-before-ranges
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
|
@ -3,9 +3,9 @@
|
||||||
USING: accessors assocs combinators
|
USING: accessors assocs combinators
|
||||||
compiler.cfg.linear-scan.allocation.splitting
|
compiler.cfg.linear-scan.allocation.splitting
|
||||||
compiler.cfg.linear-scan.allocation.state
|
compiler.cfg.linear-scan.allocation.state
|
||||||
compiler.cfg.linear-scan.live-intervals compiler.cfg.linear-scan.ranges
|
compiler.cfg.linear-scan.live-intervals
|
||||||
compiler.cfg.registers compiler.utilities fry kernel linked-assocs locals
|
compiler.cfg.linear-scan.ranges compiler.utilities fry kernel
|
||||||
math namespaces sequences ;
|
linked-assocs locals math namespaces sequences ;
|
||||||
IN: compiler.cfg.linear-scan.allocation.spilling
|
IN: compiler.cfg.linear-scan.allocation.spilling
|
||||||
|
|
||||||
: trim-before-ranges ( live-interval -- )
|
: trim-before-ranges ( live-interval -- )
|
||||||
|
|
|
@ -5,9 +5,9 @@ IN: compiler.cfg.linear-scan.allocation.splitting.tests
|
||||||
|
|
||||||
: test-interval-easy ( -- interval )
|
: test-interval-easy ( -- interval )
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ ranges { { 5 8 } { 12 20 } } }
|
{ ranges V{ { 5 8 } { 12 20 } } }
|
||||||
{ uses
|
{ uses
|
||||||
{
|
V{
|
||||||
T{ vreg-use { n 3 } { def-rep int-rep } }
|
T{ vreg-use { n 3 } { def-rep int-rep } }
|
||||||
T{ vreg-use { n 15 } { def-rep int-rep } }
|
T{ vreg-use { n 15 } { def-rep int-rep } }
|
||||||
}
|
}
|
||||||
|
@ -17,12 +17,12 @@ IN: compiler.cfg.linear-scan.allocation.splitting.tests
|
||||||
! split-interval
|
! split-interval
|
||||||
{
|
{
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ ranges { { 5 8 } } }
|
{ ranges V{ { 5 8 } } }
|
||||||
{ uses { T{ vreg-use { n 3 } { def-rep int-rep } } } }
|
{ uses V{ T{ vreg-use { n 3 } { def-rep int-rep } } } }
|
||||||
}
|
}
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ ranges { { 12 20 } } }
|
{ ranges V{ { 12 20 } } }
|
||||||
{ uses { T{ vreg-use { n 15 } { def-rep int-rep } } } }
|
{ uses V{ T{ vreg-use { n 15 } { def-rep int-rep } } } }
|
||||||
}
|
}
|
||||||
} [
|
} [
|
||||||
test-interval-easy 10 split-interval
|
test-interval-easy 10 split-interval
|
||||||
|
|
|
@ -115,7 +115,7 @@ ${
|
||||||
40 progress set
|
40 progress set
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ vreg 123 }
|
{ vreg 123 }
|
||||||
{ ranges { { 0 0 } { 30 34 } } }
|
{ ranges V{ { 0 0 } { 30 34 } } }
|
||||||
}
|
}
|
||||||
check-handled
|
check-handled
|
||||||
] unit-test
|
] unit-test
|
||||||
|
@ -144,7 +144,7 @@ ${ cell } [
|
||||||
{ { 0 34 123 } } [
|
{ { 0 34 123 } } [
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ vreg 123 }
|
{ vreg 123 }
|
||||||
{ ranges { { 0 0 } { 30 34 } } }
|
{ ranges V{ { 0 0 } { 30 34 } } }
|
||||||
} interval/sync-point-key
|
} interval/sync-point-key
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
|
@ -166,24 +166,24 @@ ${ cell } [
|
||||||
{ { 5 1/0. 1/0. } T{ sync-point { n 5 } } }
|
{ { 5 1/0. 1/0. } T{ sync-point { n 5 } } }
|
||||||
{
|
{
|
||||||
{ 20 28 f }
|
{ 20 28 f }
|
||||||
T{ live-interval-state { ranges { { 20 28 } } } }
|
T{ live-interval-state { ranges V{ { 20 28 } } } }
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
{ 20 30 f }
|
{ 20 30 f }
|
||||||
T{ live-interval-state { ranges { { 20 30 } } } }
|
T{ live-interval-state { ranges V{ { 20 30 } } } }
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
{ 33 999 f }
|
{ 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 } } }
|
{ { 33 1/0. 1/0. } T{ sync-point { n 33 } } }
|
||||||
{ { 100 1/0. 1/0. } T{ sync-point { n 100 } } }
|
{ { 100 1/0. 1/0. } T{ sync-point { n 100 } } }
|
||||||
}
|
}
|
||||||
} [
|
} [
|
||||||
{
|
{
|
||||||
T{ live-interval-state { ranges { { 20 30 } } } }
|
T{ live-interval-state { ranges V{ { 20 30 } } } }
|
||||||
T{ live-interval-state { ranges { { 20 28 } } } }
|
T{ live-interval-state { ranges V{ { 20 28 } } } }
|
||||||
T{ live-interval-state { ranges { { 33 999 } } } }
|
T{ live-interval-state { ranges V{ { 33 999 } } } }
|
||||||
T{ sync-point { n 5 } }
|
T{ sync-point { n 5 } }
|
||||||
T{ sync-point { n 33 } }
|
T{ sync-point { n 33 } }
|
||||||
T{ sync-point { n 100 } }
|
T{ sync-point { n 100 } }
|
||||||
|
@ -193,7 +193,7 @@ ${ cell } [
|
||||||
|
|
||||||
{ 2 } [
|
{ 2 } [
|
||||||
{
|
{
|
||||||
T{ live-interval-state { ranges { { 20 30 } } } }
|
T{ live-interval-state { ranges V{ { 20 30 } } } }
|
||||||
T{ live-interval-state { ranges { { 20 30 } } } }
|
T{ live-interval-state { ranges V{ { 20 30 } } } }
|
||||||
} >unhandled-min-heap heap-size
|
} >unhandled-min-heap heap-size
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
|
@ -298,7 +298,7 @@ H{
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ vreg 1 }
|
{ vreg 1 }
|
||||||
{ reg 1 }
|
{ reg 1 }
|
||||||
{ ranges { { 1 15 } } }
|
{ ranges V{ { 1 15 } } }
|
||||||
{ uses
|
{ uses
|
||||||
V{
|
V{
|
||||||
T{ vreg-use f 1 int-rep f }
|
T{ vreg-use f 1 int-rep f }
|
||||||
|
@ -312,7 +312,7 @@ H{
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ vreg 2 }
|
{ vreg 2 }
|
||||||
{ reg 2 }
|
{ reg 2 }
|
||||||
{ ranges { { 3 8 } } }
|
{ ranges V{ { 3 8 } } }
|
||||||
{ uses
|
{ uses
|
||||||
V{
|
V{
|
||||||
T{ vreg-use f 3 int-rep f }
|
T{ vreg-use f 3 int-rep f }
|
||||||
|
@ -324,7 +324,7 @@ H{
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ vreg 3 }
|
{ vreg 3 }
|
||||||
{ reg 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 } } }
|
{ uses V{ T{ vreg-use f 3 int-rep f } T{ vreg-use f 10 f int-rep } } }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -333,7 +333,7 @@ H{
|
||||||
H{ } inactive-intervals set
|
H{ } inactive-intervals set
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ vreg 1 }
|
{ vreg 1 }
|
||||||
{ ranges { { 5 5 } } }
|
{ ranges V{ { 5 5 } } }
|
||||||
{ uses V{ T{ vreg-use f 5 int-rep f } } }
|
{ uses V{ T{ vreg-use f 5 int-rep f } } }
|
||||||
}
|
}
|
||||||
spill-status
|
spill-status
|
||||||
|
@ -351,7 +351,7 @@ H{
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ vreg 1 }
|
{ vreg 1 }
|
||||||
{ reg 1 }
|
{ reg 1 }
|
||||||
{ ranges { { 1 15 } } }
|
{ ranges V{ { 1 15 } } }
|
||||||
{ uses V{ T{ vreg-use f 1 int-rep f } } }
|
{ uses V{ T{ vreg-use f 1 int-rep f } } }
|
||||||
}
|
}
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
|
@ -365,7 +365,7 @@ H{
|
||||||
H{ } inactive-intervals set
|
H{ } inactive-intervals set
|
||||||
T{ live-interval-state
|
T{ live-interval-state
|
||||||
{ vreg 3 }
|
{ vreg 3 }
|
||||||
{ ranges { { 5 5 } } }
|
{ ranges V{ { 5 5 } } }
|
||||||
{ uses V{ T{ vreg-use f 5 int-rep f } } }
|
{ uses V{ T{ vreg-use f 5 int-rep f } } }
|
||||||
}
|
}
|
||||||
spill-status
|
spill-status
|
||||||
|
|
|
@ -25,6 +25,14 @@ IN: compiler.cfg.linear-scan.live-intervals.tests
|
||||||
25 T{ live-interval-state { uses V{ T{ vreg-use { n 25 } } } } } find-use
|
25 T{ live-interval-state { uses V{ T{ vreg-use { n 25 } } } } } find-use
|
||||||
] unit-test
|
] 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?
|
! intervals-intersect?
|
||||||
{ t f f } [
|
{ t f f } [
|
||||||
{ { 4 20 } } <live-interval-for-ranges>
|
{ { 4 20 } } <live-interval-for-ranges>
|
||||||
|
@ -79,6 +87,15 @@ IN: compiler.cfg.linear-scan.live-intervals.tests
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
! record-def
|
! 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
|
] unit-test
|
||||||
|
|
|
@ -15,7 +15,7 @@ TUPLE: vreg-use n def-rep use-rep spill-slot? ;
|
||||||
TUPLE: live-interval-state
|
TUPLE: live-interval-state
|
||||||
vreg
|
vreg
|
||||||
reg spill-to spill-rep reload-from reload-rep
|
reg spill-to spill-rep reload-from reload-rep
|
||||||
ranges uses ;
|
{ ranges vector } { uses vector } ;
|
||||||
|
|
||||||
: first-use ( live-interval -- use ) uses>> first ; inline
|
: first-use ( live-interval -- use ) uses>> first ; inline
|
||||||
|
|
||||||
|
@ -133,14 +133,11 @@ ERROR: bad-live-interval live-interval ;
|
||||||
: check-start ( live-interval -- )
|
: check-start ( live-interval -- )
|
||||||
dup live-interval-start -1 = [ bad-live-interval ] [ drop ] if ;
|
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 -- )
|
: finish-live-intervals ( live-intervals -- )
|
||||||
[
|
[ finish-live-interval ] each ;
|
||||||
{
|
|
||||||
[ [ { } like reverse! ] change-ranges drop ]
|
|
||||||
[ [ { } like reverse! ] change-uses drop ]
|
|
||||||
[ check-start ]
|
|
||||||
} cleave
|
|
||||||
] each ;
|
|
||||||
|
|
||||||
TUPLE: sync-point n keep-dst? ;
|
TUPLE: sync-point n keep-dst? ;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue