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
Björn Lindqvist 2016-04-02 00:23:49 +02:00
parent e944ff7fe7
commit 026abb9c38
8 changed files with 70 additions and 56 deletions

View File

@ -8,9 +8,9 @@ IN: compiler.cfg.linear-scan.allocation.tests
: 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 } }
}
@ -20,7 +20,7 @@ IN: compiler.cfg.linear-scan.allocation.tests
: interval-[30,60] ( -- live-interval )
T{ live-interval-state
{ vreg 25 }
{ ranges { { 30 60 } } }
{ ranges V{ { 30 60 } } }
{ reg RAX }
} ;
@ -76,16 +76,16 @@ cpu x86.64? [
{ 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 } } }
}
}
} }

View File

@ -11,9 +11,9 @@ IN: compiler.cfg.linear-scan.allocation.spilling.tests
{ 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 }
@ -39,25 +39,25 @@ IN: compiler.cfg.linear-scan.allocation.spilling.tests
! 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
@ -65,12 +65,12 @@ IN: compiler.cfg.linear-scan.allocation.spilling.tests
! 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

View File

@ -3,9 +3,9 @@
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 -- )

View File

@ -5,9 +5,9 @@ IN: compiler.cfg.linear-scan.allocation.splitting.tests
: 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 } }
}
@ -17,12 +17,12 @@ IN: compiler.cfg.linear-scan.allocation.splitting.tests
! 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

View File

@ -115,7 +115,7 @@ ${
40 progress set
T{ live-interval-state
{ vreg 123 }
{ ranges { { 0 0 } { 30 34 } } }
{ ranges V{ { 0 0 } { 30 34 } } }
}
check-handled
] unit-test
@ -144,7 +144,7 @@ ${ cell } [
{ { 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
@ -166,24 +166,24 @@ ${ cell } [
{ { 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 } }
@ -193,7 +193,7 @@ ${ cell } [
{ 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

View File

@ -298,7 +298,7 @@ H{
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 }
@ -312,7 +312,7 @@ H{
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 }
@ -324,7 +324,7 @@ H{
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 } } }
}
}
@ -333,7 +333,7 @@ H{
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
@ -351,7 +351,7 @@ H{
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
@ -365,7 +365,7 @@ H{
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

View File

@ -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
] 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>
@ -79,6 +87,15 @@ IN: compiler.cfg.linear-scan.live-intervals.tests
] 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

View File

@ -15,7 +15,7 @@ TUPLE: vreg-use n def-rep use-rep spill-slot? ;
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
@ -133,14 +133,11 @@ ERROR: bad-live-interval live-interval ;
: 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? ;