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
11 compiler.cfg.linearization
14 compiler.cfg.comparisons
15 compiler.cfg.linear-scan
16 compiler.cfg.linear-scan.numbering
17 compiler.cfg.linear-scan.live-intervals
18 compiler.cfg.linear-scan.allocation
19 compiler.cfg.linear-scan.allocation.state
20 compiler.cfg.linear-scan.allocation.splitting
21 compiler.cfg.linear-scan.allocation.spilling
22 compiler.cfg.linear-scan.debugger ;
23 FROM: namespaces => set ;
24 IN: compiler.cfg.linear-scan.tests
30 { T{ live-range f 1 10 } T{ live-range f 15 15 } }
31 { T{ live-range f 16 20 } }
34 T{ live-range f 1 10 }
35 T{ live-range f 15 20 }
40 { T{ live-range f 1 10 } T{ live-range f 15 16 } }
41 { T{ live-range f 17 20 } }
44 T{ live-range f 1 10 }
45 T{ live-range f 15 20 }
50 { T{ live-range f 1 10 } }
51 { T{ live-range f 15 20 } }
54 T{ live-range f 1 10 }
55 T{ live-range f 15 20 }
60 { T{ live-range f 1 10 } T{ live-range f 15 17 } }
61 { T{ live-range f 18 20 } }
64 T{ live-range f 1 10 }
65 T{ live-range f 15 20 }
70 { T{ live-range f 1 10 } } 0 split-ranges
74 { T{ live-range f 0 0 } }
75 { T{ live-range f 1 5 } }
77 { T{ live-range f 0 5 } } 0 split-ranges
80 cfg new 0 >>spill-area-size cfg set
92 { reg-class float-regs }
95 { uses V{ T{ vreg-use f float-rep 0 } T{ vreg-use f float-rep 1 } } }
96 { ranges V{ T{ live-range f 0 2 } } }
97 { spill-to T{ spill-slot f 0 } }
101 { reg-class float-regs }
104 { uses V{ T{ vreg-use f float-rep 5 } } }
105 { ranges V{ T{ live-range f 5 5 } } }
106 { reload-from T{ spill-slot f 0 } }
111 { reg-class float-regs }
114 { uses V{ T{ vreg-use f float-rep 0 } T{ vreg-use f float-rep 1 } T{ vreg-use f float-rep 5 } } }
115 { ranges V{ T{ live-range f 0 5 } } }
122 { reg-class float-regs }
125 { uses V{ T{ vreg-use f float-rep 0 } } }
126 { ranges V{ T{ live-range f 0 1 } } }
127 { spill-to T{ spill-slot f 4 } }
131 { reg-class float-regs }
134 { uses V{ T{ vreg-use f float-rep 1 } T{ vreg-use f float-rep 5 } } }
135 { ranges V{ T{ live-range f 1 5 } } }
136 { reload-from T{ spill-slot f 4 } }
141 { reg-class float-regs }
144 { uses V{ T{ vreg-use f float-rep 0 } T{ vreg-use f float-rep 1 } T{ vreg-use f float-rep 5 } } }
145 { ranges V{ T{ live-range f 0 5 } } }
152 { reg-class float-regs }
155 { uses V{ T{ vreg-use f float-rep 0 } } }
156 { ranges V{ T{ live-range f 0 1 } } }
157 { spill-to T{ spill-slot f 8 } }
161 { reg-class float-regs }
164 { uses V{ T{ vreg-use f float-rep 20 } T{ vreg-use f float-rep 30 } } }
165 { ranges V{ T{ live-range f 20 30 } } }
166 { reload-from T{ spill-slot f 8 } }
171 { reg-class float-regs }
174 { uses V{ T{ vreg-use f float-rep 0 } T{ vreg-use f float-rep 20 } T{ vreg-use f float-rep 30 } } }
175 { ranges V{ T{ live-range f 0 8 } T{ live-range f 10 18 } T{ live-range f 20 30 } } }
183 } representations set
196 { reg-class int-regs }
200 { 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 } } }
204 { reg-class int-regs }
208 { uses V{ T{ vreg-use f int-rep 3 } T{ vreg-use f int-rep 4 } T{ vreg-use f int-rep 8 } } }
212 { reg-class int-regs }
216 { uses V{ T{ vreg-use f int-rep 3 } T{ vreg-use f int-rep 10 } } }
220 } active-intervals set
221 H{ } inactive-intervals set
224 { reg-class int-regs }
227 { uses V{ T{ vreg-use f int-rep 5 } } }
243 { reg-class int-regs }
247 { uses V{ T{ vreg-use f int-rep 1 } } }
251 { reg-class int-regs }
255 { uses V{ T{ vreg-use f int-rep 3 } T{ vreg-use f int-rep 8 } } }
259 } active-intervals set
260 H{ } inactive-intervals set
263 { reg-class int-regs }
266 { uses V{ T{ vreg-use f int-rep 5 } } }
271 H{ { 1 int-rep } { 2 int-rep } } representations set
277 { reg-class int-regs }
280 { uses V{ T{ vreg-use f int-rep 0 } T{ vreg-use f int-rep 100 } } }
281 { ranges V{ T{ live-range f 0 100 } } }
284 H{ { int-regs { "A" } } }
292 { reg-class int-regs }
295 { uses V{ T{ vreg-use f int-rep 0 } T{ vreg-use f int-rep 10 } } }
296 { ranges V{ T{ live-range f 0 10 } } }
300 { reg-class int-regs }
303 { uses V{ T{ vreg-use f int-rep 11 } T{ vreg-use f int-rep 20 } } }
304 { ranges V{ T{ live-range f 11 20 } } }
307 H{ { int-regs { "A" } } }
315 { reg-class int-regs }
318 { uses V{ T{ vreg-use f int-rep 0 } T{ vreg-use f int-rep 100 } } }
319 { ranges V{ T{ live-range f 0 100 } } }
323 { reg-class int-regs }
326 { uses V{ T{ vreg-use f int-rep 30 } T{ vreg-use f int-rep 60 } } }
327 { ranges V{ T{ live-range f 30 60 } } }
330 H{ { int-regs { "A" } } }
338 { reg-class int-regs }
341 { uses V{ T{ vreg-use f int-rep 0 } T{ vreg-use f int-rep 100 } } }
342 { ranges V{ T{ live-range f 0 100 } } }
346 { reg-class int-regs }
349 { uses V{ T{ vreg-use f int-rep 30 } T{ vreg-use f int-rep 200 } } }
350 { ranges V{ T{ live-range f 30 200 } } }
353 H{ { int-regs { "A" } } }
361 { reg-class int-regs }
364 { uses V{ T{ vreg-use f int-rep 0 } T{ vreg-use f int-rep 100 } } }
365 { ranges V{ T{ live-range f 0 100 } } }
369 { reg-class int-regs }
372 { uses V{ T{ vreg-use f int-rep 30 } T{ vreg-use f int-rep 100 } } }
373 { ranges V{ T{ live-range f 30 100 } } }
376 H{ { int-regs { "A" } } }
380 ! Problem with spilling intervals with no more usages after the spill location
387 } representations set
393 { reg-class int-regs }
396 { uses V{ T{ vreg-use f int-rep 0 } T{ vreg-use f int-rep 10 } T{ vreg-use f int-rep 20 } } }
397 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
401 { reg-class int-regs }
404 { uses V{ T{ vreg-use f int-rep 0 } T{ vreg-use f int-rep 10 } T{ vreg-use f int-rep 20 } } }
405 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
409 { reg-class int-regs }
412 { uses V{ T{ vreg-use f int-rep 6 } } }
413 { ranges V{ T{ live-range f 4 8 } } }
417 { reg-class int-regs }
420 { uses V{ T{ vreg-use f int-rep 8 } } }
421 { ranges V{ T{ live-range f 4 8 } } }
424 ! This guy will invoke the 'spill partially available' code path
427 { reg-class int-regs }
430 { uses V{ T{ vreg-use f int-rep 8 } } }
431 { ranges V{ T{ live-range f 4 8 } } }
434 H{ { int-regs { "A" "B" } } }
438 ! Test spill-new code path
444 { reg-class int-regs }
447 { uses V{ T{ vreg-use f int-rep 0 } T{ vreg-use f int-rep 6 } T{ vreg-use f int-rep 10 } } }
448 { ranges V{ T{ live-range f 0 10 } } }
451 ! This guy will invoke the 'spill new' code path
454 { reg-class int-regs }
457 { uses V{ T{ vreg-use f int-rep 8 } } }
458 { ranges V{ T{ live-range f 2 8 } } }
461 H{ { int-regs { "A" } } }
466 T{ live-range f 0 10 }
467 T{ live-range f 20 30 }
472 T{ live-range f 0 10 }
473 T{ live-range f 10 30 }
478 T{ live-range f 0 10 }
479 T{ live-range f 5 30 }
484 T{ live-range f 5 30 }
485 T{ live-range f 0 10 }
490 T{ live-range f 5 10 }
491 T{ live-range f 0 15 }
497 T{ live-range f 0 10 }
498 T{ live-range f 20 30 }
499 T{ live-range f 40 50 }
502 T{ live-range f 11 15 }
503 T{ live-range f 31 35 }
504 T{ live-range f 50 55 }
506 intersect-live-ranges
511 T{ live-range f 0 10 }
512 T{ live-range f 20 30 }
513 T{ live-range f 40 50 }
516 T{ live-range f 11 15 }
517 T{ live-range f 31 36 }
518 T{ live-range f 51 55 }
520 intersect-live-ranges
526 { reg-class int-regs }
529 { ranges V{ T{ live-range f 0 10 } } }
533 { reg-class int-regs }
536 { ranges V{ T{ live-range f 5 10 } } }
538 relevant-ranges intersect-live-ranges
541 ! register-status had problems because it used map>assoc where the sequence
548 } representations set
551 H{ { int-regs { 0 1 } } } registers set
557 { reg-class int-regs }
561 { ranges V{ T{ live-range f 0 2 } T{ live-range f 10 20 } } }
562 { uses V{ 0 2 10 20 } }
567 { reg-class int-regs }
571 { ranges V{ T{ live-range f 4 6 } T{ live-range f 30 40 } } }
572 { uses V{ 4 6 30 40 } }
576 } inactive-intervals set
582 { reg-class int-regs }
586 { ranges V{ T{ live-range f 0 40 } } }
591 } active-intervals set
595 { reg-class int-regs }
598 { ranges V{ T{ live-range f 8 10 } } }
599 { uses V{ T{ vreg-use f int-rep 8 } T{ vreg-use f int-rep 10 } } }