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 cfg set
91 { reg-class float-regs }
94 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 1 f float-rep } } }
95 { ranges V{ T{ live-range f 0 2 } } }
96 { spill-to T{ spill-slot f 0 } }
97 { spill-rep float-rep }
101 { reg-class float-regs }
104 { uses V{ T{ vreg-use f 5 f float-rep } } }
105 { ranges V{ T{ live-range f 5 5 } } }
106 { reload-from T{ spill-slot f 0 } }
107 { reload-rep float-rep }
112 { reg-class float-regs }
115 { 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 } } }
116 { ranges V{ T{ live-range f 0 5 } } }
124 { reg-class float-regs }
127 { uses V{ T{ vreg-use f 1 f float-rep } T{ vreg-use f 5 f float-rep } } }
128 { ranges V{ T{ live-range f 1 5 } } }
129 { reload-from T{ spill-slot f 4 } }
130 { reload-rep float-rep }
135 { reg-class float-regs }
138 { 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 } } }
139 { ranges V{ T{ live-range f 0 5 } } }
146 { reg-class float-regs }
149 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 1 f float-rep } } }
150 { ranges V{ T{ live-range f 0 2 } } }
151 { spill-to T{ spill-slot f 8 } }
152 { spill-rep float-rep }
158 { reg-class float-regs }
161 { 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 } } }
162 { ranges V{ T{ live-range f 0 5 } } }
169 { reg-class float-regs }
172 { uses V{ T{ vreg-use f 0 float-rep f } } }
173 { ranges V{ T{ live-range f 0 1 } } }
174 { spill-to T{ spill-slot f 12 } }
175 { spill-rep float-rep }
179 { reg-class float-regs }
182 { uses V{ T{ vreg-use f 20 f float-rep } T{ vreg-use f 30 f float-rep } } }
183 { ranges V{ T{ live-range f 20 30 } } }
184 { reload-from T{ spill-slot f 12 } }
185 { reload-rep float-rep }
190 { reg-class float-regs }
193 { 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 } } }
194 { ranges V{ T{ live-range f 0 8 } T{ live-range f 10 18 } T{ live-range f 20 30 } } }
198 ! Don't insert reload if first usage is a def
202 { reg-class float-regs }
205 { uses V{ T{ vreg-use f 0 float-rep f } } }
206 { ranges V{ T{ live-range f 0 1 } } }
207 { spill-to T{ spill-slot f 16 } }
208 { spill-rep float-rep }
212 { reg-class float-regs }
215 { uses V{ T{ vreg-use f 20 float-rep f } T{ vreg-use f 30 f float-rep } } }
216 { ranges V{ T{ live-range f 20 30 } } }
221 { reg-class float-regs }
224 { 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 } } }
225 { ranges V{ T{ live-range f 0 8 } T{ live-range f 10 18 } T{ live-range f 20 30 } } }
229 ! Multiple representations
233 { reg-class float-regs }
236 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 10 double-rep float-rep } } }
237 { ranges V{ T{ live-range f 0 11 } } }
238 { spill-to T{ spill-slot f 24 } }
239 { spill-rep double-rep }
243 { reg-class float-regs }
246 { uses V{ T{ vreg-use f 20 f double-rep } } }
247 { ranges V{ T{ live-range f 20 20 } } }
248 { reload-from T{ spill-slot f 24 } }
249 { reload-rep double-rep }
254 { reg-class float-regs }
257 { 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 } } }
258 { ranges V{ T{ live-range f 0 20 } } }
266 } representations set
279 { reg-class int-regs }
283 { 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 } } }
287 { reg-class int-regs }
291 { 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 } } }
295 { reg-class int-regs }
299 { uses V{ T{ vreg-use f 3 int-rep f } T{ vreg-use f 10 f int-rep } } }
303 } active-intervals set
304 H{ } inactive-intervals set
307 { reg-class int-regs }
310 { uses V{ T{ vreg-use f 5 int-rep f } } }
326 { reg-class int-regs }
330 { uses V{ T{ vreg-use f 1 int-rep f } } }
334 { reg-class int-regs }
338 { uses V{ T{ vreg-use f 3 int-rep f } T{ vreg-use f 8 f int-rep } } }
342 } active-intervals set
343 H{ } inactive-intervals set
346 { reg-class int-regs }
349 { uses V{ T{ vreg-use f 5 int-rep f } } }
354 H{ { 1 int-rep } { 2 int-rep } } representations set
360 { reg-class int-regs }
363 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
364 { ranges V{ T{ live-range f 0 100 } } }
367 H{ { int-regs { "A" } } }
375 { reg-class int-regs }
378 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 10 f int-rep } } }
379 { ranges V{ T{ live-range f 0 10 } } }
383 { reg-class int-regs }
386 { uses V{ T{ vreg-use f 11 int-rep f } T{ vreg-use f 20 f int-rep } } }
387 { ranges V{ T{ live-range f 11 20 } } }
390 H{ { int-regs { "A" } } }
398 { reg-class int-regs }
401 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
402 { ranges V{ T{ live-range f 0 100 } } }
406 { reg-class int-regs }
409 { uses V{ T{ vreg-use f 30 int-rep f } T{ vreg-use f 60 f int-rep } } }
410 { ranges V{ T{ live-range f 30 60 } } }
413 H{ { int-regs { "A" } } }
421 { reg-class int-regs }
424 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
425 { ranges V{ T{ live-range f 0 100 } } }
429 { reg-class int-regs }
432 { uses V{ T{ vreg-use f 30 int-rep f } T{ vreg-use f 200 f int-rep } } }
433 { ranges V{ T{ live-range f 30 200 } } }
436 H{ { int-regs { "A" } } }
444 { reg-class int-regs }
447 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
448 { ranges V{ T{ live-range f 0 100 } } }
452 { reg-class int-regs }
455 { uses V{ T{ vreg-use f 30 int-rep f } T{ vreg-use f 100 f int-rep } } }
456 { ranges V{ T{ live-range f 30 100 } } }
459 H{ { int-regs { "A" } } }
463 ! Problem with spilling intervals with no more usages after the spill location
470 } representations set
476 { reg-class int-regs }
479 { 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 } } }
480 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
484 { reg-class int-regs }
487 { 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 } } }
488 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
492 { reg-class int-regs }
495 { uses V{ T{ vreg-use f 6 int-rep f } } }
496 { ranges V{ T{ live-range f 4 8 } } }
500 { reg-class int-regs }
503 { uses V{ T{ vreg-use f 8 int-rep f } } }
504 { ranges V{ T{ live-range f 4 8 } } }
507 ! This guy will invoke the 'spill partially available' code path
510 { reg-class int-regs }
513 { uses V{ T{ vreg-use f 8 int-rep f } } }
514 { ranges V{ T{ live-range f 4 8 } } }
517 H{ { int-regs { "A" "B" } } }
521 ! Test spill-new code path
527 { reg-class int-regs }
530 { 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 } } }
531 { ranges V{ T{ live-range f 0 10 } } }
534 ! This guy will invoke the 'spill new' code path
537 { reg-class int-regs }
540 { uses V{ T{ vreg-use f 8 int-rep f } } }
541 { ranges V{ T{ live-range f 2 8 } } }
544 H{ { int-regs { "A" } } }
549 T{ live-range f 0 10 }
550 T{ live-range f 20 30 }
555 T{ live-range f 0 10 }
556 T{ live-range f 10 30 }
561 T{ live-range f 0 10 }
562 T{ live-range f 5 30 }
567 T{ live-range f 5 30 }
568 T{ live-range f 0 10 }
573 T{ live-range f 5 10 }
574 T{ live-range f 0 15 }
580 T{ live-range f 0 10 }
581 T{ live-range f 20 30 }
582 T{ live-range f 40 50 }
585 T{ live-range f 11 15 }
586 T{ live-range f 31 35 }
587 T{ live-range f 50 55 }
589 intersect-live-ranges
594 T{ live-range f 0 10 }
595 T{ live-range f 20 30 }
596 T{ live-range f 40 50 }
599 T{ live-range f 11 15 }
600 T{ live-range f 31 36 }
601 T{ live-range f 51 55 }
603 intersect-live-ranges
609 { reg-class int-regs }
612 { ranges V{ T{ live-range f 0 10 } } }
616 { reg-class int-regs }
619 { ranges V{ T{ live-range f 5 10 } } }
621 relevant-ranges intersect-live-ranges
624 ! register-status had problems because it used map>assoc where the sequence
631 } representations set
634 H{ { int-regs { 0 1 } } } registers set
640 { reg-class int-regs }
644 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
645 { uses V{ 0 2 10 20 } }
650 { reg-class int-regs }
654 { ranges V{ T{ live-range f 4 6 } T{ live-range f 30 40 } } }
655 { uses V{ 4 6 30 40 } }
659 } inactive-intervals set
665 { reg-class int-regs }
669 { ranges V{ T{ live-range f 0 40 } } }
674 } active-intervals set
678 { reg-class int-regs }
681 { ranges V{ T{ live-range f 8 10 } } }
682 { uses V{ T{ vreg-use f 8 int-rep f } T{ vreg-use f 10 f int-rep } } }