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.linear-scan
15 compiler.cfg.linear-scan.numbering
16 compiler.cfg.linear-scan.live-intervals
17 compiler.cfg.linear-scan.allocation
18 compiler.cfg.linear-scan.allocation.state
19 compiler.cfg.linear-scan.allocation.splitting
20 compiler.cfg.linear-scan.allocation.spilling
21 compiler.cfg.linear-scan.debugger ;
22 FROM: namespaces => set ;
23 IN: compiler.cfg.linear-scan.tests
29 { T{ live-range f 1 10 } T{ live-range f 15 15 } }
30 { T{ live-range f 16 20 } }
33 T{ live-range f 1 10 }
34 T{ live-range f 15 20 }
39 { T{ live-range f 1 10 } T{ live-range f 15 16 } }
40 { T{ live-range f 17 20 } }
43 T{ live-range f 1 10 }
44 T{ live-range f 15 20 }
49 { T{ live-range f 1 10 } }
50 { T{ live-range f 15 20 } }
53 T{ live-range f 1 10 }
54 T{ live-range f 15 20 }
59 { T{ live-range f 1 10 } T{ live-range f 15 17 } }
60 { T{ live-range f 18 20 } }
63 T{ live-range f 1 10 }
64 T{ live-range f 15 20 }
69 { T{ live-range f 1 10 } } 0 split-ranges
73 { T{ live-range f 0 0 } }
74 { T{ live-range f 1 5 } }
76 { T{ live-range f 0 5 } } 0 split-ranges
79 cfg new 0 >>spill-area-size 4 >>spill-area-align cfg set
88 : clean-up-split ( a b -- a b )
89 [ dup [ [ >vector ] change-uses [ >vector ] change-ranges ] when ] bi@ ;
94 { reg-class float-regs }
97 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 1 f float-rep } } }
98 { ranges V{ T{ live-range f 0 2 } } }
99 { spill-to T{ spill-slot f 0 } }
100 { spill-rep float-rep }
104 { reg-class float-regs }
107 { uses V{ T{ vreg-use f 5 f float-rep } } }
108 { ranges V{ T{ live-range f 5 5 } } }
109 { reload-from T{ spill-slot f 0 } }
110 { reload-rep float-rep }
115 { reg-class float-regs }
118 { 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 } } }
119 { ranges V{ T{ live-range f 0 5 } } }
128 { reg-class float-regs }
131 { uses V{ T{ vreg-use f 1 f float-rep } T{ vreg-use f 5 f float-rep } } }
132 { ranges V{ T{ live-range f 1 5 } } }
133 { reload-from T{ spill-slot f 4 } }
134 { reload-rep float-rep }
139 { reg-class float-regs }
142 { 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 } } }
143 { ranges V{ T{ live-range f 0 5 } } }
151 { reg-class float-regs }
154 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 1 f float-rep } } }
155 { ranges V{ T{ live-range f 0 2 } } }
156 { spill-to T{ spill-slot f 8 } }
157 { spill-rep float-rep }
163 { reg-class float-regs }
166 { 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 } } }
167 { ranges V{ T{ live-range f 0 5 } } }
175 { reg-class float-regs }
178 { uses V{ T{ vreg-use f 0 float-rep f } } }
179 { ranges V{ T{ live-range f 0 1 } } }
180 { spill-to T{ spill-slot f 12 } }
181 { spill-rep float-rep }
185 { reg-class float-regs }
188 { uses V{ T{ vreg-use f 20 f float-rep } T{ vreg-use f 30 f float-rep } } }
189 { ranges V{ T{ live-range f 20 30 } } }
190 { reload-from T{ spill-slot f 12 } }
191 { reload-rep float-rep }
196 { reg-class float-regs }
199 { 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 } } }
200 { ranges V{ T{ live-range f 0 8 } T{ live-range f 10 18 } T{ live-range f 20 30 } } }
205 ! Don't insert reload if first usage is a def
209 { reg-class float-regs }
212 { uses V{ T{ vreg-use f 0 float-rep f } } }
213 { ranges V{ T{ live-range f 0 1 } } }
214 { spill-to T{ spill-slot f 16 } }
215 { spill-rep float-rep }
219 { reg-class float-regs }
222 { uses V{ T{ vreg-use f 20 float-rep f } T{ vreg-use f 30 f float-rep } } }
223 { ranges V{ T{ live-range f 20 30 } } }
228 { reg-class float-regs }
231 { 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 } } }
232 { ranges V{ T{ live-range f 0 8 } T{ live-range f 10 18 } T{ live-range f 20 30 } } }
237 ! Multiple representations
241 { reg-class float-regs }
244 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 10 double-rep float-rep } } }
245 { ranges V{ T{ live-range f 0 11 } } }
246 { spill-to T{ spill-slot f 24 } }
247 { spill-rep double-rep }
251 { reg-class float-regs }
254 { uses V{ T{ vreg-use f 20 f double-rep } } }
255 { ranges V{ T{ live-range f 20 20 } } }
256 { reload-from T{ spill-slot f 24 } }
257 { reload-rep double-rep }
262 { reg-class float-regs }
265 { 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 } } }
266 { ranges V{ T{ live-range f 0 20 } } }
277 { ranges V{ T{ live-range f 8 8 } } }
278 { uses V{ T{ vreg-use f 8 int-rep } } }
279 { reg-class int-regs }
286 { ranges V{ T{ live-range f 4 8 } } }
287 { uses V{ T{ vreg-use f 8 int-rep } } }
288 { reg-class int-regs }
293 ! trim-before-ranges, trim-after-ranges
299 { ranges V{ T{ live-range f 0 3 } } }
300 { uses V{ T{ vreg-use f 0 f int-rep } T{ vreg-use f 2 f int-rep } } }
301 { reg-class int-regs }
302 { spill-to T{ spill-slot f 32 } }
303 { spill-rep int-rep }
309 { ranges V{ T{ live-range f 14 16 } } }
310 { uses V{ T{ vreg-use f 14 f int-rep } } }
311 { reg-class int-regs }
312 { reload-from T{ spill-slot f 32 } }
313 { reload-rep int-rep }
320 { ranges V{ T{ live-range f 0 4 } T{ live-range f 6 10 } T{ live-range f 12 16 } } }
321 { uses V{ T{ vreg-use f 0 f int-rep } T{ vreg-use f 2 f int-rep } T{ vreg-use f 14 f int-rep } } }
322 { reg-class int-regs }
331 } representations set
344 { reg-class int-regs }
348 { 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 } } }
352 { reg-class int-regs }
356 { 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 } } }
360 { reg-class int-regs }
364 { uses V{ T{ vreg-use f 3 int-rep f } T{ vreg-use f 10 f int-rep } } }
368 } active-intervals set
369 H{ } inactive-intervals set
372 { reg-class int-regs }
375 { uses V{ T{ vreg-use f 5 int-rep f } } }
391 { reg-class int-regs }
395 { uses V{ T{ vreg-use f 1 int-rep f } } }
399 { reg-class int-regs }
403 { uses V{ T{ vreg-use f 3 int-rep f } T{ vreg-use f 8 f int-rep } } }
407 } active-intervals set
408 H{ } inactive-intervals set
411 { reg-class int-regs }
414 { uses V{ T{ vreg-use f 5 int-rep f } } }
419 H{ { 1 int-rep } { 2 int-rep } } representations set
425 { reg-class int-regs }
428 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
429 { ranges V{ T{ live-range f 0 100 } } }
432 H{ { int-regs { "A" } } }
440 { reg-class int-regs }
443 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 10 f int-rep } } }
444 { ranges V{ T{ live-range f 0 10 } } }
448 { reg-class int-regs }
451 { uses V{ T{ vreg-use f 11 int-rep f } T{ vreg-use f 20 f int-rep } } }
452 { ranges V{ T{ live-range f 11 20 } } }
455 H{ { int-regs { "A" } } }
463 { reg-class int-regs }
466 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
467 { ranges V{ T{ live-range f 0 100 } } }
471 { reg-class int-regs }
474 { uses V{ T{ vreg-use f 30 int-rep f } T{ vreg-use f 60 f int-rep } } }
475 { ranges V{ T{ live-range f 30 60 } } }
478 H{ { int-regs { "A" } } }
486 { reg-class int-regs }
489 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
490 { ranges V{ T{ live-range f 0 100 } } }
494 { reg-class int-regs }
497 { uses V{ T{ vreg-use f 30 int-rep f } T{ vreg-use f 200 f int-rep } } }
498 { ranges V{ T{ live-range f 30 200 } } }
501 H{ { int-regs { "A" } } }
509 { reg-class int-regs }
512 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
513 { ranges V{ T{ live-range f 0 100 } } }
517 { reg-class int-regs }
520 { uses V{ T{ vreg-use f 30 int-rep f } T{ vreg-use f 100 f int-rep } } }
521 { ranges V{ T{ live-range f 30 100 } } }
524 H{ { int-regs { "A" } } }
528 ! Problem with spilling intervals with no more usages after the spill location
535 } representations set
541 { reg-class int-regs }
544 { 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 } } }
545 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
549 { reg-class int-regs }
552 { 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 } } }
553 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
557 { reg-class int-regs }
560 { uses V{ T{ vreg-use f 6 int-rep f } } }
561 { ranges V{ T{ live-range f 4 8 } } }
565 { reg-class int-regs }
568 { uses V{ T{ vreg-use f 8 int-rep f } } }
569 { ranges V{ T{ live-range f 4 8 } } }
572 ! This guy will invoke the 'spill partially available' code path
575 { reg-class int-regs }
578 { uses V{ T{ vreg-use f 8 int-rep f } } }
579 { ranges V{ T{ live-range f 4 8 } } }
582 H{ { int-regs { "A" "B" } } }
586 ! Test spill-new code path
592 { reg-class int-regs }
595 { 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 } } }
596 { ranges V{ T{ live-range f 0 10 } } }
599 ! This guy will invoke the 'spill new' code path
602 { reg-class int-regs }
605 { uses V{ T{ vreg-use f 8 int-rep f } } }
606 { ranges V{ T{ live-range f 2 8 } } }
609 H{ { int-regs { "A" } } }
614 T{ live-range f 0 10 }
615 T{ live-range f 20 30 }
620 T{ live-range f 0 10 }
621 T{ live-range f 10 30 }
626 T{ live-range f 0 10 }
627 T{ live-range f 5 30 }
632 T{ live-range f 5 30 }
633 T{ live-range f 0 10 }
638 T{ live-range f 5 10 }
639 T{ live-range f 0 15 }
645 T{ live-range f 0 10 }
646 T{ live-range f 20 30 }
647 T{ live-range f 40 50 }
650 T{ live-range f 11 15 }
651 T{ live-range f 31 35 }
652 T{ live-range f 50 55 }
654 intersect-live-ranges
659 T{ live-range f 0 10 }
660 T{ live-range f 20 30 }
661 T{ live-range f 40 50 }
664 T{ live-range f 11 15 }
665 T{ live-range f 31 36 }
666 T{ live-range f 51 55 }
668 intersect-live-ranges
674 { reg-class int-regs }
677 { ranges V{ T{ live-range f 0 10 } } }
681 { reg-class int-regs }
684 { ranges V{ T{ live-range f 5 10 } } }
686 relevant-ranges intersect-live-ranges
689 ! register-status had problems because it used map>assoc where the sequence
696 } representations set
699 H{ { int-regs { 0 1 } } } registers set
705 { reg-class int-regs }
709 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
710 { uses V{ 0 2 10 20 } }
715 { reg-class int-regs }
719 { ranges V{ T{ live-range f 4 6 } T{ live-range f 30 40 } } }
720 { uses V{ 4 6 30 40 } }
724 } inactive-intervals set
730 { reg-class int-regs }
734 { ranges V{ T{ live-range f 0 40 } } }
739 } active-intervals set
743 { reg-class int-regs }
746 { ranges V{ T{ live-range f 8 10 } } }
747 { uses V{ T{ vreg-use f 8 int-rep f } T{ vreg-use f 10 f int-rep } } }