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{ { 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{ { 5 5 } } }
89 { reload-from T{ spill-slot f 0 } }
90 { reload-rep float-rep }
93 T{ live-interval-state
99 T{ vreg-use f 0 float-rep f }
100 T{ vreg-use f 1 f float-rep }
101 T{ vreg-use f 5 f float-rep }
104 { ranges V{ { 0 5 } } }
111 T{ live-interval-state
115 { uses V{ T{ vreg-use f 1 f float-rep } T{ vreg-use f 5 f float-rep } } }
116 { ranges V{ { 1 5 } } }
117 { reload-from T{ spill-slot f 4 } }
118 { reload-rep float-rep }
121 T{ live-interval-state
127 T{ vreg-use f 0 float-rep f }
128 T{ vreg-use f 1 f float-rep }
129 T{ vreg-use f 5 f float-rep }
132 { ranges V{ { 0 5 } } }
138 T{ live-interval-state
142 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 1 f float-rep } } }
143 { ranges V{ { 0 2 } } }
144 { spill-to T{ spill-slot f 8 } }
145 { spill-rep float-rep }
149 T{ live-interval-state
155 T{ vreg-use f 0 float-rep f }
156 T{ vreg-use f 1 f float-rep }
157 T{ vreg-use f 5 f float-rep }
160 { ranges V{ { 0 5 } } }
166 T{ live-interval-state
170 { uses V{ T{ vreg-use f 0 float-rep f } } }
171 { ranges V{ { 0 1 } } }
172 { spill-to T{ spill-slot f 12 } }
173 { spill-rep float-rep }
175 T{ live-interval-state
179 { uses V{ T{ vreg-use f 20 f float-rep } T{ vreg-use f 30 f float-rep } } }
180 { ranges V{ { 20 30 } } }
181 { reload-from T{ spill-slot f 12 } }
182 { reload-rep float-rep }
185 T{ live-interval-state
191 T{ vreg-use f 0 float-rep f }
192 T{ vreg-use f 20 f float-rep }
193 T{ vreg-use f 30 f float-rep }
196 { ranges V{ { 0 8 } { 10 18 } { 20 30 } } }
201 ! Don't insert reload if first usage is a def
203 T{ live-interval-state
207 { uses V{ T{ vreg-use f 0 float-rep f } } }
208 { ranges V{ { 0 1 } } }
209 { spill-to T{ spill-slot f 16 } }
210 { spill-rep float-rep }
212 T{ live-interval-state
216 { uses V{ T{ vreg-use f 20 float-rep f } T{ vreg-use f 30 f float-rep } } }
217 { ranges V{ { 20 30 } } }
220 T{ live-interval-state
226 T{ vreg-use f 0 float-rep f }
227 T{ vreg-use f 20 float-rep f }
228 T{ vreg-use f 30 f float-rep }
231 { ranges V{ { 0 8 } { 10 18 } { 20 30 } } }
236 ! Multiple representations
238 T{ live-interval-state
242 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 10 double-rep float-rep } } }
243 { ranges V{ { 0 11 } } }
244 { spill-to T{ spill-slot f 24 } }
245 { spill-rep double-rep }
247 T{ live-interval-state
251 { uses V{ T{ vreg-use f 20 f double-rep } } }
252 { ranges V{ { 20 20 } } }
253 { reload-from T{ spill-slot f 24 } }
254 { reload-rep double-rep }
257 T{ live-interval-state
263 T{ vreg-use f 0 float-rep f }
264 T{ vreg-use f 10 double-rep float-rep }
265 T{ vreg-use f 20 f double-rep }
268 { ranges V{ { 0 20 } } }
275 T{ live-interval-state
279 { ranges V{ { 8 8 } } }
280 { uses V{ T{ vreg-use f 8 int-rep } } }
283 T{ live-interval-state
287 { ranges V{ { 4 8 } } }
288 { uses V{ T{ vreg-use f 8 int-rep } } }
293 ! trim-before-ranges, trim-after-ranges
295 T{ live-interval-state
299 { ranges V{ { 0 3 } } }
300 { uses V{ T{ vreg-use f 0 f int-rep } T{ vreg-use f 2 f int-rep } } }
301 { spill-to T{ spill-slot f 32 } }
302 { spill-rep int-rep }
304 T{ live-interval-state
308 { ranges V{ { 14 16 } } }
309 { uses V{ T{ vreg-use f 14 f int-rep } } }
310 { reload-from T{ spill-slot f 32 } }
311 { reload-rep int-rep }
314 T{ live-interval-state
318 { ranges V{ { 0 4 } { 6 10 } { 12 16 } } }
321 T{ vreg-use f 0 f int-rep }
322 T{ vreg-use f 2 f int-rep }
323 T{ vreg-use f 14 f int-rep } }
333 } representations set
344 T{ live-interval-state
351 T{ vreg-use f 1 int-rep f }
352 T{ vreg-use f 3 f int-rep }
353 T{ vreg-use f 7 f int-rep }
354 T{ vreg-use f 10 f int-rep }
355 T{ vreg-use f 15 f int-rep }
359 T{ live-interval-state
366 T{ vreg-use f 3 int-rep f }
367 T{ vreg-use f 4 f int-rep }
368 T{ vreg-use f 8 f int-rep }
372 T{ live-interval-state
377 { uses V{ T{ vreg-use f 3 int-rep f } T{ vreg-use f 10 f int-rep } } }
381 } active-intervals set
382 H{ } inactive-intervals set
383 T{ live-interval-state
387 { uses V{ T{ vreg-use f 5 int-rep f } } }
401 T{ live-interval-state
406 { uses V{ T{ vreg-use f 1 int-rep f } } }
408 T{ live-interval-state
413 { uses V{ T{ vreg-use f 3 int-rep f } T{ vreg-use f 8 f int-rep } } }
417 } active-intervals set
418 H{ } inactive-intervals set
419 T{ live-interval-state
423 { uses V{ T{ vreg-use f 5 int-rep f } } }
428 H{ { 1 int-rep } { 2 int-rep } } representations set
432 T{ live-interval-state
436 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
437 { ranges V{ { 0 100 } } }
440 H{ { int-regs { "A" } } }
446 T{ live-interval-state
450 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 10 f int-rep } } }
451 { ranges V{ { 0 10 } } }
453 T{ live-interval-state
457 { uses V{ T{ vreg-use f 11 int-rep f } T{ vreg-use f 20 f int-rep } } }
458 { ranges V{ { 11 20 } } }
461 H{ { int-regs { "A" } } }
467 T{ live-interval-state
471 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
472 { ranges V{ { 0 100 } } }
474 T{ live-interval-state
478 { uses V{ T{ vreg-use f 30 int-rep f } T{ vreg-use f 60 f int-rep } } }
479 { ranges V{ { 30 60 } } }
482 H{ { int-regs { "A" } } }
488 T{ live-interval-state
492 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
493 { ranges V{ { 0 100 } } }
495 T{ live-interval-state
499 { uses V{ T{ vreg-use f 30 int-rep f } T{ vreg-use f 200 f int-rep } } }
500 { ranges V{ { 30 200 } } }
503 H{ { int-regs { "A" } } }
509 T{ live-interval-state
513 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
514 { ranges V{ { 0 100 } } }
516 T{ live-interval-state
520 { uses V{ T{ vreg-use f 30 int-rep f } T{ vreg-use f 100 f int-rep } } }
521 { ranges V{ { 30 100 } } }
524 H{ { int-regs { "A" } } }
528 ! Problem with spilling intervals with no more usages after the spill location
535 } representations set
539 T{ live-interval-state
545 T{ vreg-use f 0 int-rep f }
546 T{ vreg-use f 10 f int-rep }
547 T{ vreg-use f 20 f int-rep }
550 { ranges V{ { 0 2 } { 10 20 } } }
552 T{ live-interval-state
558 T{ vreg-use f 0 int-rep f }
559 T{ vreg-use f 10 f int-rep }
560 T{ vreg-use f 20 f int-rep }
563 { ranges V{ { 0 2 } { 10 20 } } }
565 T{ live-interval-state
569 { uses V{ T{ vreg-use f 6 int-rep f } } }
570 { ranges V{ { 4 8 } } }
572 T{ live-interval-state
576 { uses V{ T{ vreg-use f 8 int-rep f } } }
577 { ranges V{ { 4 8 } } }
580 ! This guy will invoke the 'spill partially available' code path
581 T{ live-interval-state
585 { uses V{ T{ vreg-use f 8 int-rep f } } }
586 { ranges V{ { 4 8 } } }
589 H{ { int-regs { "A" "B" } } }
593 ! Test spill-new code path
597 T{ live-interval-state
601 { 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 } } }
602 { ranges V{ { 0 10 } } }
605 ! This guy will invoke the 'spill new' code path
606 T{ live-interval-state
610 { uses V{ T{ vreg-use f 8 int-rep f } } }
611 { ranges V{ { 2 8 } } }
614 H{ { int-regs { "A" } } }
618 ! register-status had problems because it used map>assoc where the sequence
625 } representations set
631 T{ live-interval-state
636 { ranges V{ { 0 2 } { 10 20 } } }
637 { uses V{ 0 2 10 20 } }
640 T{ live-interval-state
645 { ranges V{ { 4 6 } { 30 40 } } }
646 { uses V{ 4 6 30 40 } }
650 } inactive-intervals set
654 T{ live-interval-state
659 { ranges V{ { 0 40 } } }
664 } active-intervals set
666 T{ live-interval-state
670 { ranges V{ { 8 10 } } }
671 { uses V{ T{ vreg-use f 8 int-rep f } T{ vreg-use f 10 f int-rep } } }
673 H{ { int-regs { 0 1 } } } register-status
677 T{ cfg { frame-pointer? f } } admissible-registers machine-registers =
681 T{ cfg { frame-pointer? t } } admissible-registers
682 int-regs of frame-reg swap member?