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 float-rep 0 } T{ vreg-use f float-rep 1 } } }
95 { ranges V{ T{ live-range f 0 2 } } }
96 { spill-to T{ spill-slot f 0 } }
100 { reg-class float-regs }
103 { uses V{ T{ vreg-use f float-rep 5 } } }
104 { ranges V{ T{ live-range f 5 5 } } }
105 { reload-from T{ spill-slot f 0 } }
110 { reg-class float-regs }
113 { uses V{ T{ vreg-use f float-rep 0 } T{ vreg-use f float-rep 1 } T{ vreg-use f float-rep 5 } } }
114 { ranges V{ T{ live-range f 0 5 } } }
121 { reg-class float-regs }
124 { uses V{ T{ vreg-use f float-rep 0 } } }
125 { ranges V{ T{ live-range f 0 1 } } }
126 { spill-to T{ spill-slot f 4 } }
130 { reg-class float-regs }
133 { uses V{ T{ vreg-use f float-rep 1 } T{ vreg-use f float-rep 5 } } }
134 { ranges V{ T{ live-range f 1 5 } } }
135 { reload-from T{ spill-slot f 4 } }
140 { reg-class float-regs }
143 { uses V{ T{ vreg-use f float-rep 0 } T{ vreg-use f float-rep 1 } T{ vreg-use f float-rep 5 } } }
144 { ranges V{ T{ live-range f 0 5 } } }
151 { reg-class float-regs }
154 { uses V{ T{ vreg-use f float-rep 0 } } }
155 { ranges V{ T{ live-range f 0 1 } } }
156 { spill-to T{ spill-slot f 8 } }
160 { reg-class float-regs }
163 { uses V{ T{ vreg-use f float-rep 20 } T{ vreg-use f float-rep 30 } } }
164 { ranges V{ T{ live-range f 20 30 } } }
165 { reload-from T{ spill-slot f 8 } }
170 { reg-class float-regs }
173 { uses V{ T{ vreg-use f float-rep 0 } T{ vreg-use f float-rep 20 } T{ vreg-use f float-rep 30 } } }
174 { ranges V{ T{ live-range f 0 8 } T{ live-range f 10 18 } T{ live-range f 20 30 } } }
182 } representations set
195 { reg-class int-regs }
199 { uses V{ T{ vreg-use f int-rep 1 } T{ vreg-use f int-rep 3 } T{ vreg-use f int-rep 7 } T{ vreg-use f int-rep 10 } T{ vreg-use f int-rep 15 } } }
203 { reg-class int-regs }
207 { uses V{ T{ vreg-use f int-rep 3 } T{ vreg-use f int-rep 4 } T{ vreg-use f int-rep 8 } } }
211 { reg-class int-regs }
215 { uses V{ T{ vreg-use f int-rep 3 } T{ vreg-use f int-rep 10 } } }
219 } active-intervals set
220 H{ } inactive-intervals set
223 { reg-class int-regs }
226 { uses V{ T{ vreg-use f int-rep 5 } } }
242 { reg-class int-regs }
246 { uses V{ T{ vreg-use f int-rep 1 } } }
250 { reg-class int-regs }
254 { uses V{ T{ vreg-use f int-rep 3 } T{ vreg-use f int-rep 8 } } }
258 } active-intervals set
259 H{ } inactive-intervals set
262 { reg-class int-regs }
265 { uses V{ T{ vreg-use f int-rep 5 } } }
270 H{ { 1 int-rep } { 2 int-rep } } representations set
276 { reg-class int-regs }
279 { uses V{ T{ vreg-use f int-rep 0 } T{ vreg-use f int-rep 100 } } }
280 { ranges V{ T{ live-range f 0 100 } } }
283 H{ { int-regs { "A" } } }
291 { reg-class int-regs }
294 { uses V{ T{ vreg-use f int-rep 0 } T{ vreg-use f int-rep 10 } } }
295 { ranges V{ T{ live-range f 0 10 } } }
299 { reg-class int-regs }
302 { uses V{ T{ vreg-use f int-rep 11 } T{ vreg-use f int-rep 20 } } }
303 { ranges V{ T{ live-range f 11 20 } } }
306 H{ { int-regs { "A" } } }
314 { reg-class int-regs }
317 { uses V{ T{ vreg-use f int-rep 0 } T{ vreg-use f int-rep 100 } } }
318 { ranges V{ T{ live-range f 0 100 } } }
322 { reg-class int-regs }
325 { uses V{ T{ vreg-use f int-rep 30 } T{ vreg-use f int-rep 60 } } }
326 { ranges V{ T{ live-range f 30 60 } } }
329 H{ { int-regs { "A" } } }
337 { reg-class int-regs }
340 { uses V{ T{ vreg-use f int-rep 0 } T{ vreg-use f int-rep 100 } } }
341 { ranges V{ T{ live-range f 0 100 } } }
345 { reg-class int-regs }
348 { uses V{ T{ vreg-use f int-rep 30 } T{ vreg-use f int-rep 200 } } }
349 { ranges V{ T{ live-range f 30 200 } } }
352 H{ { int-regs { "A" } } }
360 { reg-class int-regs }
363 { uses V{ T{ vreg-use f int-rep 0 } T{ vreg-use f int-rep 100 } } }
364 { ranges V{ T{ live-range f 0 100 } } }
368 { reg-class int-regs }
371 { uses V{ T{ vreg-use f int-rep 30 } T{ vreg-use f int-rep 100 } } }
372 { ranges V{ T{ live-range f 30 100 } } }
375 H{ { int-regs { "A" } } }
379 ! Problem with spilling intervals with no more usages after the spill location
386 } representations set
392 { reg-class int-regs }
395 { uses V{ T{ vreg-use f int-rep 0 } T{ vreg-use f int-rep 10 } T{ vreg-use f int-rep 20 } } }
396 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
400 { reg-class int-regs }
403 { uses V{ T{ vreg-use f int-rep 0 } T{ vreg-use f int-rep 10 } T{ vreg-use f int-rep 20 } } }
404 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
408 { reg-class int-regs }
411 { uses V{ T{ vreg-use f int-rep 6 } } }
412 { ranges V{ T{ live-range f 4 8 } } }
416 { reg-class int-regs }
419 { uses V{ T{ vreg-use f int-rep 8 } } }
420 { ranges V{ T{ live-range f 4 8 } } }
423 ! This guy will invoke the 'spill partially available' code path
426 { reg-class int-regs }
429 { uses V{ T{ vreg-use f int-rep 8 } } }
430 { ranges V{ T{ live-range f 4 8 } } }
433 H{ { int-regs { "A" "B" } } }
437 ! Test spill-new code path
443 { reg-class int-regs }
446 { uses V{ T{ vreg-use f int-rep 0 } T{ vreg-use f int-rep 6 } T{ vreg-use f int-rep 10 } } }
447 { ranges V{ T{ live-range f 0 10 } } }
450 ! This guy will invoke the 'spill new' code path
453 { reg-class int-regs }
456 { uses V{ T{ vreg-use f int-rep 8 } } }
457 { ranges V{ T{ live-range f 2 8 } } }
460 H{ { int-regs { "A" } } }
465 T{ live-range f 0 10 }
466 T{ live-range f 20 30 }
471 T{ live-range f 0 10 }
472 T{ live-range f 10 30 }
477 T{ live-range f 0 10 }
478 T{ live-range f 5 30 }
483 T{ live-range f 5 30 }
484 T{ live-range f 0 10 }
489 T{ live-range f 5 10 }
490 T{ live-range f 0 15 }
496 T{ live-range f 0 10 }
497 T{ live-range f 20 30 }
498 T{ live-range f 40 50 }
501 T{ live-range f 11 15 }
502 T{ live-range f 31 35 }
503 T{ live-range f 50 55 }
505 intersect-live-ranges
510 T{ live-range f 0 10 }
511 T{ live-range f 20 30 }
512 T{ live-range f 40 50 }
515 T{ live-range f 11 15 }
516 T{ live-range f 31 36 }
517 T{ live-range f 51 55 }
519 intersect-live-ranges
525 { reg-class int-regs }
528 { ranges V{ T{ live-range f 0 10 } } }
532 { reg-class int-regs }
535 { ranges V{ T{ live-range f 5 10 } } }
537 relevant-ranges intersect-live-ranges
540 ! register-status had problems because it used map>assoc where the sequence
547 } representations set
550 H{ { int-regs { 0 1 } } } registers set
556 { reg-class int-regs }
560 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
561 { uses V{ 0 2 10 20 } }
566 { reg-class int-regs }
570 { ranges V{ T{ live-range f 4 6 } T{ live-range f 30 40 } } }
571 { uses V{ 4 6 30 40 } }
575 } inactive-intervals set
581 { reg-class int-regs }
585 { ranges V{ T{ live-range f 0 40 } } }
590 } active-intervals set
594 { reg-class int-regs }
597 { ranges V{ T{ live-range f 8 10 } } }
598 { uses V{ T{ vreg-use f int-rep 8 } T{ vreg-use f int-rep 10 } } }