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 } } }
150 { ranges V{ T{ live-range f 0 1 } } }
151 { spill-to T{ spill-slot f 8 } }
152 { spill-rep float-rep }
156 { reg-class float-regs }
159 { uses V{ T{ vreg-use f 20 f float-rep } T{ vreg-use f 30 f float-rep } } }
160 { ranges V{ T{ live-range f 20 30 } } }
161 { reload-from T{ spill-slot f 8 } }
162 { reload-rep float-rep }
167 { reg-class float-regs }
170 { 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 } } }
171 { ranges V{ T{ live-range f 0 8 } T{ live-range f 10 18 } T{ live-range f 20 30 } } }
175 ! Don't insert reload if first usage is a def
179 { reg-class float-regs }
182 { uses V{ T{ vreg-use f 0 float-rep f } } }
183 { ranges V{ T{ live-range f 0 1 } } }
184 { spill-to T{ spill-slot f 12 } }
185 { spill-rep float-rep }
189 { reg-class float-regs }
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 } } }
198 { reg-class float-regs }
201 { 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 } } }
202 { ranges V{ T{ live-range f 0 8 } T{ live-range f 10 18 } T{ live-range f 20 30 } } }
206 ! Multiple representations
210 { reg-class float-regs }
213 { uses V{ T{ vreg-use f 0 float-rep f } T{ vreg-use f 10 double-rep float-rep } } }
214 { ranges V{ T{ live-range f 0 11 } } }
215 { spill-to T{ spill-slot f 16 } }
216 { spill-rep double-rep }
220 { reg-class float-regs }
223 { uses V{ T{ vreg-use f 20 f double-rep } } }
224 { ranges V{ T{ live-range f 20 20 } } }
225 { reload-from T{ spill-slot f 16 } }
226 { reload-rep double-rep }
231 { reg-class float-regs }
234 { 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 } } }
235 { ranges V{ T{ live-range f 0 20 } } }
243 } representations set
256 { reg-class int-regs }
260 { 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 } } }
264 { reg-class int-regs }
268 { 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 } } }
272 { reg-class int-regs }
276 { uses V{ T{ vreg-use f 3 int-rep f } T{ vreg-use f 10 f int-rep } } }
280 } active-intervals set
281 H{ } inactive-intervals set
284 { reg-class int-regs }
287 { uses V{ T{ vreg-use f 5 int-rep f } } }
303 { reg-class int-regs }
307 { uses V{ T{ vreg-use f 1 int-rep f } } }
311 { reg-class int-regs }
315 { uses V{ T{ vreg-use f 3 int-rep f } T{ vreg-use f 8 f int-rep } } }
319 } active-intervals set
320 H{ } inactive-intervals set
323 { reg-class int-regs }
326 { uses V{ T{ vreg-use f 5 int-rep f } } }
331 H{ { 1 int-rep } { 2 int-rep } } representations set
337 { reg-class int-regs }
340 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 100 f int-rep } } }
341 { ranges V{ T{ live-range f 0 100 } } }
344 H{ { int-regs { "A" } } }
352 { reg-class int-regs }
355 { uses V{ T{ vreg-use f 0 int-rep f } T{ vreg-use f 10 f int-rep } } }
356 { ranges V{ T{ live-range f 0 10 } } }
360 { reg-class int-regs }
363 { uses V{ T{ vreg-use f 11 int-rep f } T{ vreg-use f 20 f int-rep } } }
364 { ranges V{ T{ live-range f 11 20 } } }
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 100 f int-rep } } }
379 { ranges V{ T{ live-range f 0 100 } } }
383 { reg-class int-regs }
386 { uses V{ T{ vreg-use f 30 int-rep f } T{ vreg-use f 60 f int-rep } } }
387 { ranges V{ T{ live-range f 30 60 } } }
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 200 f int-rep } } }
410 { ranges V{ T{ live-range f 30 200 } } }
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 100 f int-rep } } }
433 { ranges V{ T{ live-range f 30 100 } } }
436 H{ { int-regs { "A" } } }
440 ! Problem with spilling intervals with no more usages after the spill location
447 } representations set
453 { reg-class int-regs }
456 { 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 } } }
457 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
461 { reg-class int-regs }
464 { 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 } } }
465 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
469 { reg-class int-regs }
472 { uses V{ T{ vreg-use f 6 int-rep f } } }
473 { ranges V{ T{ live-range f 4 8 } } }
477 { reg-class int-regs }
480 { uses V{ T{ vreg-use f 8 int-rep f } } }
481 { ranges V{ T{ live-range f 4 8 } } }
484 ! This guy will invoke the 'spill partially available' code path
487 { reg-class int-regs }
490 { uses V{ T{ vreg-use f 8 int-rep f } } }
491 { ranges V{ T{ live-range f 4 8 } } }
494 H{ { int-regs { "A" "B" } } }
498 ! Test spill-new code path
504 { reg-class int-regs }
507 { 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 } } }
508 { ranges V{ T{ live-range f 0 10 } } }
511 ! This guy will invoke the 'spill new' code path
514 { reg-class int-regs }
517 { uses V{ T{ vreg-use f 8 int-rep f } } }
518 { ranges V{ T{ live-range f 2 8 } } }
521 H{ { int-regs { "A" } } }
526 T{ live-range f 0 10 }
527 T{ live-range f 20 30 }
532 T{ live-range f 0 10 }
533 T{ live-range f 10 30 }
538 T{ live-range f 0 10 }
539 T{ live-range f 5 30 }
544 T{ live-range f 5 30 }
545 T{ live-range f 0 10 }
550 T{ live-range f 5 10 }
551 T{ live-range f 0 15 }
557 T{ live-range f 0 10 }
558 T{ live-range f 20 30 }
559 T{ live-range f 40 50 }
562 T{ live-range f 11 15 }
563 T{ live-range f 31 35 }
564 T{ live-range f 50 55 }
566 intersect-live-ranges
571 T{ live-range f 0 10 }
572 T{ live-range f 20 30 }
573 T{ live-range f 40 50 }
576 T{ live-range f 11 15 }
577 T{ live-range f 31 36 }
578 T{ live-range f 51 55 }
580 intersect-live-ranges
586 { reg-class int-regs }
589 { ranges V{ T{ live-range f 0 10 } } }
593 { reg-class int-regs }
596 { ranges V{ T{ live-range f 5 10 } } }
598 relevant-ranges intersect-live-ranges
601 ! register-status had problems because it used map>assoc where the sequence
608 } representations set
611 H{ { int-regs { 0 1 } } } registers set
617 { reg-class int-regs }
621 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
622 { uses V{ 0 2 10 20 } }
627 { reg-class int-regs }
631 { ranges V{ T{ live-range f 4 6 } T{ live-range f 30 40 } } }
632 { uses V{ 4 6 30 40 } }
636 } inactive-intervals set
642 { reg-class int-regs }
646 { ranges V{ T{ live-range f 0 40 } } }
651 } active-intervals set
655 { reg-class int-regs }
658 { ranges V{ T{ live-range f 8 10 } } }
659 { uses V{ T{ vreg-use f 8 int-rep f } T{ vreg-use f 10 f int-rep } } }