1 USING: tools.test random sorting sequences sets hashtables assocs
2 kernel fry arrays splitting namespaces math accessors vectors locals
3 math.order grouping strings strings.private classes layouts
7 compiler.cfg.instructions
9 compiler.cfg.predecessors
13 compiler.cfg.comparisons
14 compiler.cfg.ssa.destruction.leaders
15 compiler.cfg.linear-scan
16 compiler.cfg.linear-scan.allocation
17 compiler.cfg.linear-scan.allocation.state
18 compiler.cfg.linear-scan.allocation.splitting
19 compiler.cfg.linear-scan.allocation.spilling
20 compiler.cfg.linear-scan.live-intervals
21 compiler.cfg.linear-scan.numbering
22 compiler.cfg.linear-scan.ranges
23 compiler.cfg.linear-scan.debugger
24 compiler.cfg.utilities ;
25 IN: compiler.cfg.linear-scan.tests
30 ! Live interval calculation
32 ! A value is defined and never used; make sure it has the right
35 T{ ##load-integer f 1 0 }
36 T{ ##replace-imm f D: 0 "hi" }
40 : test-live-intervals ( -- )
42 [ cfg set ] [ number-instructions ] [ compute-live-intervals ] tri
56 1 live-intervals get at [ start>> ] [ end>> ] bi
59 ! Live interval splitting
61 cfg new 0 >>spill-area-size 4 >>spill-area-align cfg set
70 : clean-up-split ( a b -- a b )
71 [ dup [ [ >vector ] change-uses [ >vector ] change-ranges ] when ] bi@ ;
74 T{ live-interval-state
78 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 1 f float-rep } } }
79 { ranges V{ T{ live-range f 0 2 } } }
80 { spill-to T{ spill-slot f 0 } }
81 { spill-rep float-rep }
83 T{ live-interval-state
87 { uses V{ T{ vreg-use f 5 f float-rep } } }
88 { ranges V{ T{ live-range f 5 5 } } }
89 { reload-from T{ spill-slot f 0 } }
90 { reload-rep float-rep }
93 T{ live-interval-state
97 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 1 f float-rep } T{ vreg-use f 5 f float-rep } } }
98 { ranges V{ T{ live-range f 0 5 } } }
105 T{ live-interval-state
109 { uses V{ T{ vreg-use f 1 f float-rep } T{ vreg-use f 5 f float-rep } } }
110 { ranges V{ T{ live-range f 1 5 } } }
111 { reload-from T{ spill-slot f 4 } }
112 { reload-rep float-rep }
115 T{ live-interval-state
119 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 1 f float-rep } T{ vreg-use f 5 f float-rep } } }
120 { ranges V{ T{ live-range f 0 5 } } }
126 T{ live-interval-state
130 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 1 f float-rep } } }
131 { ranges V{ T{ live-range f 0 2 } } }
132 { spill-to T{ spill-slot f 8 } }
133 { spill-rep float-rep }
137 T{ live-interval-state
141 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 1 f float-rep } T{ vreg-use f 5 f float-rep } } }
142 { ranges V{ T{ live-range f 0 5 } } }
148 T{ live-interval-state
152 { uses V{ T{ vreg-use f 0 float-rep f } } }
153 { ranges V{ T{ live-range f 0 1 } } }
154 { spill-to T{ spill-slot f 12 } }
155 { spill-rep float-rep }
157 T{ live-interval-state
161 { uses V{ T{ vreg-use f 20 f float-rep } T{ vreg-use f 30 f float-rep } } }
162 { ranges V{ T{ live-range f 20 30 } } }
163 { reload-from T{ spill-slot f 12 } }
164 { reload-rep float-rep }
167 T{ live-interval-state
171 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 20 f float-rep } T{ vreg-use f 30 f float-rep } } }
172 { ranges V{ T{ live-range f 0 8 } T{ live-range f 10 18 } T{ live-range f 20 30 } } }
177 ! Don't insert reload if first usage is a def
179 T{ live-interval-state
183 { uses V{ T{ vreg-use f 0 float-rep f } } }
184 { ranges V{ T{ live-range f 0 1 } } }
185 { spill-to T{ spill-slot f 16 } }
186 { spill-rep float-rep }
188 T{ live-interval-state
192 { uses V{ T{ vreg-use f 20 float-rep f } T{ vreg-use f 30 f float-rep } } }
193 { ranges V{ T{ live-range f 20 30 } } }
196 T{ live-interval-state
200 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 20 float-rep f } T{ vreg-use f 30 f float-rep } } }
201 { ranges V{ T{ live-range f 0 8 } T{ live-range f 10 18 } T{ live-range f 20 30 } } }
206 ! Multiple representations
208 T{ live-interval-state
212 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 10 double-rep float-rep } } }
213 { ranges V{ T{ live-range f 0 11 } } }
214 { spill-to T{ spill-slot f 24 } }
215 { spill-rep double-rep }
217 T{ live-interval-state
221 { uses V{ T{ vreg-use f 20 f double-rep } } }
222 { ranges V{ T{ live-range f 20 20 } } }
223 { reload-from T{ spill-slot f 24 } }
224 { reload-rep double-rep }
227 T{ live-interval-state
231 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 10 double-rep float-rep } T{ vreg-use f 20 f double-rep } } }
232 { ranges V{ T{ live-range f 0 20 } } }
239 T{ live-interval-state
243 { ranges V{ T{ live-range f 8 8 } } }
244 { uses V{ T{ vreg-use f 8 int-rep } } }
247 T{ live-interval-state
251 { ranges V{ T{ live-range f 4 8 } } }
252 { uses V{ T{ vreg-use f 8 int-rep } } }
257 ! trim-before-ranges, trim-after-ranges
259 T{ live-interval-state
263 { ranges V{ T{ live-range f 0 3 } } }
264 { uses V{ T{ vreg-use f 0 f int-rep } T{ vreg-use f 2 f int-rep } } }
265 { spill-to T{ spill-slot f 32 } }
266 { spill-rep int-rep }
268 T{ live-interval-state
272 { ranges V{ T{ live-range f 14 16 } } }
273 { uses V{ T{ vreg-use f 14 f int-rep } } }
274 { reload-from T{ spill-slot f 32 } }
275 { reload-rep int-rep }
278 T{ live-interval-state
282 { ranges V{ T{ live-range f 0 4 } T{ live-range f 6 10 } T{ live-range f 12 16 } } }
285 T{ vreg-use f 0 f int-rep }
286 T{ vreg-use f 2 f int-rep }
287 T{ vreg-use f 14 f int-rep } }
297 } representations set
308 T{ live-interval-state
313 { uses V{ T{ vreg-use f 1 int-rep f } T{ vreg-use f 3 f int-rep } T{ vreg-use f 7 f int-rep } T{ vreg-use f 10 f int-rep } T{ vreg-use f 15 f int-rep } } }
315 T{ live-interval-state
320 { uses V{ T{ vreg-use f 3 int-rep f } T{ vreg-use f 4 f int-rep } T{ vreg-use f 8 f int-rep } } }
322 T{ live-interval-state
327 { uses V{ T{ vreg-use f 3 int-rep f } T{ vreg-use f 10 f int-rep } } }
331 } active-intervals set
332 H{ } inactive-intervals set
333 T{ live-interval-state
337 { uses V{ T{ vreg-use f 5 int-rep f } } }
351 T{ live-interval-state
356 { uses V{ T{ vreg-use f 1 int-rep f } } }
358 T{ live-interval-state
363 { uses V{ T{ vreg-use f 3 int-rep f } T{ vreg-use f 8 f int-rep } } }
367 } active-intervals set
368 H{ } inactive-intervals set
369 T{ live-interval-state
373 { uses V{ T{ vreg-use f 5 int-rep f } } }
378 H{ { 1 int-rep } { 2 int-rep } } representations set
382 T{ live-interval-state
386 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
387 { ranges V{ T{ live-range f 0 100 } } }
390 H{ { int-regs { "A" } } }
396 T{ live-interval-state
400 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 10 f int-rep } } }
401 { ranges V{ T{ live-range f 0 10 } } }
403 T{ live-interval-state
407 { uses V{ T{ vreg-use f 11 int-rep f } T{ vreg-use f 20 f int-rep } } }
408 { ranges V{ T{ live-range f 11 20 } } }
411 H{ { int-regs { "A" } } }
417 T{ live-interval-state
421 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
422 { ranges V{ T{ live-range f 0 100 } } }
424 T{ live-interval-state
428 { uses V{ T{ vreg-use f 30 int-rep f } T{ vreg-use f 60 f int-rep } } }
429 { ranges V{ T{ live-range f 30 60 } } }
432 H{ { int-regs { "A" } } }
438 T{ live-interval-state
442 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
443 { ranges V{ T{ live-range f 0 100 } } }
445 T{ live-interval-state
449 { uses V{ T{ vreg-use f 30 int-rep f } T{ vreg-use f 200 f int-rep } } }
450 { ranges V{ T{ live-range f 30 200 } } }
453 H{ { int-regs { "A" } } }
459 T{ live-interval-state
463 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
464 { ranges V{ T{ live-range f 0 100 } } }
466 T{ live-interval-state
470 { uses V{ T{ vreg-use f 30 int-rep f } T{ vreg-use f 100 f int-rep } } }
471 { ranges V{ T{ live-range f 30 100 } } }
474 H{ { int-regs { "A" } } }
478 ! Problem with spilling intervals with no more usages after the spill location
485 } representations set
489 T{ live-interval-state
493 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 10 f int-rep } T{ vreg-use f 20 f int-rep } } }
494 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
496 T{ live-interval-state
500 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 10 f int-rep } T{ vreg-use f 20 f int-rep } } }
501 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
503 T{ live-interval-state
507 { uses V{ T{ vreg-use f 6 int-rep f } } }
508 { ranges V{ T{ live-range f 4 8 } } }
510 T{ live-interval-state
514 { uses V{ T{ vreg-use f 8 int-rep f } } }
515 { ranges V{ T{ live-range f 4 8 } } }
518 ! This guy will invoke the 'spill partially available' code path
519 T{ live-interval-state
523 { uses V{ T{ vreg-use f 8 int-rep f } } }
524 { ranges V{ T{ live-range f 4 8 } } }
527 H{ { int-regs { "A" "B" } } }
531 ! Test spill-new code path
535 T{ live-interval-state
539 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 6 f int-rep } T{ vreg-use f 10 f int-rep } } }
540 { ranges V{ T{ live-range f 0 10 } } }
543 ! This guy will invoke the 'spill new' code path
544 T{ live-interval-state
548 { uses V{ T{ vreg-use f 8 int-rep f } } }
549 { ranges V{ T{ live-range f 2 8 } } }
552 H{ { int-regs { "A" } } }
556 ! register-status had problems because it used map>assoc where the sequence
563 } representations set
569 T{ live-interval-state
574 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
575 { uses V{ 0 2 10 20 } }
578 T{ live-interval-state
583 { ranges V{ T{ live-range f 4 6 } T{ live-range f 30 40 } } }
584 { uses V{ 4 6 30 40 } }
588 } inactive-intervals set
592 T{ live-interval-state
597 { ranges V{ T{ live-range f 0 40 } } }
602 } active-intervals set
604 T{ live-interval-state
608 { ranges V{ T{ live-range f 8 10 } } }
609 { uses V{ T{ vreg-use f 8 int-rep f } T{ vreg-use f 10 f int-rep } } }
611 H{ { int-regs { 0 1 } } } register-status
615 T{ cfg { frame-pointer? f } } admissible-registers machine-registers =
619 T{ cfg { frame-pointer? t } } admissible-registers
620 int-regs of frame-reg swap member?