]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/cfg/linear-scan/linear-scan-tests.factor
Merge branch 'master' into global_optimization
[factor.git] / basis / compiler / cfg / linear-scan / linear-scan-tests.factor
1 IN: compiler.cfg.linear-scan.tests
2 USING: tools.test random sorting sequences sets hashtables assocs
3 kernel fry arrays splitting namespaces math accessors vectors
4 math.order grouping
5 cpu.architecture
6 compiler.cfg
7 compiler.cfg.optimizer
8 compiler.cfg.instructions
9 compiler.cfg.registers
10 compiler.cfg.linear-scan
11 compiler.cfg.linear-scan.live-intervals
12 compiler.cfg.linear-scan.allocation
13 compiler.cfg.linear-scan.debugger ;
14
15 [ 7 ] [
16     T{ live-interval
17         { vreg T{ vreg { reg-class int-regs } { n 2 } } }
18         { start 0 }
19         { end 10 }
20         { uses V{ 0 1 3 7 10 } }
21     }
22     4 [ >= ] find-use nip
23 ] unit-test
24
25 [ 4 ] [
26     T{ live-interval
27         { vreg T{ vreg { reg-class int-regs } { n 2 } } }
28         { start 0 }
29         { end 10 }
30         { uses V{ 0 1 3 4 10 } }
31     }
32     4 [ >= ] find-use nip
33 ] unit-test
34
35 [ f ] [
36     T{ live-interval
37         { vreg T{ vreg { reg-class int-regs } { n 2 } } }
38         { start 0 }
39         { end 10 }
40         { uses V{ 0 1 3 4 10 } }
41     }
42     100 [ >= ] find-use nip
43 ] unit-test
44
45 [
46     T{ live-interval
47         { vreg T{ vreg { reg-class int-regs } { n 1 } } }
48         { start 0 }
49         { end 1 }
50         { uses V{ 0 1 } }
51     }
52     T{ live-interval
53         { vreg T{ vreg { reg-class int-regs } { n 1 } } }
54         { start 5 }
55         { end 5 }
56         { uses V{ 5 } }
57     }
58 ] [
59     T{ live-interval
60         { vreg T{ vreg { reg-class int-regs } { n 1 } } }
61         { start 0 }
62         { end 5 }
63         { uses V{ 0 1 5 } }
64     } 2 split-interval
65 ] unit-test
66
67 [
68     T{ live-interval
69         { vreg T{ vreg { reg-class int-regs } { n 1 } } }
70         { start 0 }
71         { end 0 }
72         { uses V{ 0 } }
73     }
74     T{ live-interval
75         { vreg T{ vreg { reg-class int-regs } { n 1 } } }
76         { start 1 }
77         { end 5 }
78         { uses V{ 1 5 } }
79     }
80 ] [
81     T{ live-interval
82         { vreg T{ vreg { reg-class int-regs } { n 1 } } }
83         { start 0 }
84         { end 5 }
85         { uses V{ 0 1 5 } }
86     } 0 split-interval
87 ] unit-test
88
89 [
90     T{ live-interval
91         { vreg T{ vreg { reg-class int-regs } { n 1 } } }
92         { start 3 }
93         { end 10 }
94         { uses V{ 3 10 } }
95     }
96 ] [
97     {
98         T{ live-interval
99             { vreg T{ vreg { reg-class int-regs } { n 1 } } }
100             { start 1 }
101             { end 15 }
102             { uses V{ 1 3 7 10 15 } }
103         }
104         T{ live-interval
105             { vreg T{ vreg { reg-class int-regs } { n 1 } } }
106             { start 3 }
107             { end 8 }
108             { uses V{ 3 4 8 } }
109         }
110         T{ live-interval
111             { vreg T{ vreg { reg-class int-regs } { n 1 } } }
112             { start 3 }
113             { end 10 }
114             { uses V{ 3 10 } }
115         }
116     }
117     T{ live-interval
118         { vreg T{ vreg { reg-class int-regs } { n 1 } } }
119         { start 5 }
120         { end 5 }
121         { uses V{ 5 } }
122     }
123     interval-to-spill
124 ] unit-test
125
126 [ t ] [
127     T{ live-interval
128         { vreg T{ vreg { reg-class int-regs } { n 1 } } }
129         { start 5 }
130         { end 15 }
131         { uses V{ 5 10 15 } }
132     }
133     T{ live-interval
134         { vreg T{ vreg { reg-class int-regs } { n 1 } } }
135         { start 1 }
136         { end 20 }
137         { uses V{ 1 20 } }
138     }
139     spill-existing?
140 ] unit-test
141
142 [ f ] [
143     T{ live-interval
144         { vreg T{ vreg { reg-class int-regs } { n 1 } } }
145         { start 5 }
146         { end 15 }
147         { uses V{ 5 10 15 } }
148     }
149     T{ live-interval
150         { vreg T{ vreg { reg-class int-regs } { n 1 } } }
151         { start 1 }
152         { end 20 }
153         { uses V{ 1 7 20 } }
154     }
155     spill-existing?
156 ] unit-test
157
158 [ t ] [
159     T{ live-interval
160         { vreg T{ vreg { reg-class int-regs } { n 1 } } }
161         { start 5 }
162         { end 5 }
163         { uses V{ 5 } }
164     }
165     T{ live-interval
166         { vreg T{ vreg { reg-class int-regs } { n 1 } } }
167         { start 1 }
168         { end 20 }
169         { uses V{ 1 7 20 } }
170     }
171     spill-existing?
172 ] unit-test
173
174 [ ] [
175     {
176         T{ live-interval { vreg T{ vreg { n 1 } { reg-class int-regs } } } { start 0 } { end 100 } { uses V{ 0 100 } } }
177     }
178     H{ { int-regs { "A" } } }
179     check-linear-scan
180 ] unit-test
181
182 [ ] [
183     {
184         T{ live-interval { vreg T{ vreg { n 1 } { reg-class int-regs } } } { start 0 } { end 10 } { uses V{ 0 10 } } }
185         T{ live-interval { vreg T{ vreg { n 2 } { reg-class int-regs } } } { start 11 } { end 20 } { uses V{ 11 20 } } }
186     }
187     H{ { int-regs { "A" } } }
188     check-linear-scan
189 ] unit-test
190
191 [ ] [
192     {
193         T{ live-interval { vreg T{ vreg { n 1 } { reg-class int-regs } } } { start 0 } { end 100 } { uses V{ 0 100 } } }
194         T{ live-interval { vreg T{ vreg { n 2 } { reg-class int-regs } } } { start 30 } { end 60 } { uses V{ 30 60 } } }
195     }
196     H{ { int-regs { "A" } } }
197     check-linear-scan
198 ] unit-test
199
200 [ ] [
201     {
202         T{ live-interval { vreg T{ vreg { n 1 } { reg-class int-regs } } } { start 0 } { end 100 } { uses V{ 0 100 } } }
203         T{ live-interval { vreg T{ vreg { n 2 } { reg-class int-regs } } } { start 30 } { end 200 } { uses V{ 30 200 } } }
204     }
205     H{ { int-regs { "A" } } }
206     check-linear-scan
207 ] unit-test
208
209 [
210     {
211         T{ live-interval { vreg T{ vreg { n 1 } { reg-class int-regs } } } { start 0 } { end 100 } { uses V{ 0 100 } } }
212         T{ live-interval { vreg T{ vreg { n 2 } { reg-class int-regs } } } { start 30 } { end 100 } { uses V{ 30 100 } } }
213     }
214     H{ { int-regs { "A" } } }
215     check-linear-scan
216 ] must-fail
217
218 SYMBOL: available
219
220 SYMBOL: taken
221
222 SYMBOL: max-registers
223
224 SYMBOL: max-insns
225
226 SYMBOL: max-uses
227
228 : not-taken ( -- n )
229     available get keys dup empty? [ "Oops" throw ] when
230     random
231     dup taken get nth 1 + max-registers get = [
232         dup available get delete-at
233     ] [
234         dup taken get [ 1 + ] change-nth
235     ] if ;
236
237 : random-live-intervals ( num-intervals max-uses max-registers max-insns -- seq )
238     [
239         max-insns set
240         max-registers set
241         max-uses set
242         max-insns get [ 0 ] replicate taken set
243         max-insns get [ dup ] H{ } map>assoc available set
244         [
245             live-interval new
246                 swap int-regs swap vreg boa >>vreg
247                 max-uses get random 2 max [ not-taken ] replicate natural-sort
248                 [ >>uses ] [ first >>start ] bi
249                 dup uses>> last >>end
250         ] map
251     ] with-scope ;
252
253 : random-test ( num-intervals max-uses max-registers max-insns -- )
254     over [ random-live-intervals ] dip int-regs associate check-linear-scan ;
255
256 [ ] [ 30 2 1 60 random-test ] unit-test
257 [ ] [ 60 2 2 60 random-test ] unit-test
258 [ ] [ 80 2 3 200 random-test ] unit-test
259 [ ] [ 70 2 5 30 random-test ] unit-test
260 [ ] [ 60 2 6 30 random-test ] unit-test
261 [ ] [ 1 2 10 10 random-test ] unit-test
262
263 [ ] [ 10 4 2 60 random-test ] unit-test
264 [ ] [ 10 20 2 400 random-test ] unit-test
265 [ ] [ 10 20 4 300 random-test ] unit-test
266
267 USING: math.private compiler.cfg.debugger ;
268
269 [ ] [
270     [ float+ float>fixnum 3 fixnum*fast ]
271     test-cfg first optimize-cfg linear-scan drop
272 ] unit-test
273
274 [ f ] [
275     T{ basic-block
276        { instructions
277          V{
278              T{ ##allot
279                 f
280                 T{ vreg f int-regs 1 }
281                 40
282                 array
283                 T{ vreg f int-regs 2 }
284                 f
285              }
286          }
287        }
288     } clone [ [ clone ] map ] change-instructions
289     dup 1array (linear-scan) instructions>> first regs>> values all-equal?
290 ] unit-test
291
292 [ 0 1 ] [
293     {
294         T{ live-interval
295             { vreg T{ vreg { reg-class int-regs } { n 1 } } }
296             { start 0 }
297             { end 5 }
298             { uses V{ 0 1 5 } }
299         }
300         T{ live-interval
301             { vreg T{ vreg { reg-class int-regs } { n 2 } } }
302             { start 3 }
303             { end 4 }
304             { uses V{ 3 4 } }
305         }
306         T{ live-interval
307             { vreg T{ vreg { reg-class int-regs } { n 3 } } }
308             { start 2 }
309             { end 6 }
310             { uses V{ 2 4 6 } }
311         }
312     } [ clone ] map
313     H{ { int-regs { "A" "B" } } }
314     allocate-registers
315     first split-before>> [ start>> ] [ end>> ] bi
316 ] unit-test
317
318 ! Coalescing interacted badly with splitting
319 [ ] [
320     {
321         T{ live-interval
322             { vreg V int-regs 70 }
323             { start 14 }
324             { end 17 }
325             { uses V{ 14 15 16 17 } }
326             { copy-from V int-regs 67 }
327         }
328         T{ live-interval
329             { vreg V int-regs 67 }
330             { start 13 }
331             { end 14 }
332             { uses V{ 13 14 } }
333         }
334         T{ live-interval
335             { vreg V int-regs 30 }
336             { start 4 }
337             { end 18 }
338             { uses V{ 4 12 16 17 18 } }
339         }
340         T{ live-interval
341             { vreg V int-regs 27 }
342             { start 3 }
343             { end 13 }
344             { uses V{ 3 7 13 } }
345         }
346         T{ live-interval
347             { vreg V int-regs 59 }
348             { start 10 }
349             { end 18 }
350             { uses V{ 10 11 12 18 } }
351             { copy-from V int-regs 56 }
352         }
353         T{ live-interval
354             { vreg V int-regs 60 }
355             { start 12 }
356             { end 17 }
357             { uses V{ 12 17 } }
358         }
359         T{ live-interval
360             { vreg V int-regs 56 }
361             { start 9 }
362             { end 10 }
363             { uses V{ 9 10 } }
364         }
365     }
366     { { int-regs { 0 1 2 3 } } }
367     allocate-registers drop
368 ] unit-test
369
370 [ ] [
371     {
372         T{ live-interval
373             { vreg V int-regs 3687168 }
374             { start 106 }
375             { end 112 }
376             { uses V{ 106 112 } }
377         }
378         T{ live-interval
379             { vreg V int-regs 3687169 }
380             { start 107 }
381             { end 113 }
382             { uses V{ 107 113 } }
383         }
384         T{ live-interval
385             { vreg V int-regs 3687727 }
386             { start 190 }
387             { end 198 }
388             { uses V{ 190 195 198 } }
389         }
390         T{ live-interval
391             { vreg V int-regs 3686445 }
392             { start 43 }
393             { end 44 }
394             { uses V{ 43 44 } }
395         }
396         T{ live-interval
397             { vreg V int-regs 3686195 }
398             { start 5 }
399             { end 11 }
400             { uses V{ 5 11 } }
401         }
402         T{ live-interval
403             { vreg V int-regs 3686449 }
404             { start 44 }
405             { end 56 }
406             { uses V{ 44 45 45 46 56 } }
407             { copy-from V int-regs 3686445 }
408         }
409         T{ live-interval
410             { vreg V int-regs 3686198 }
411             { start 8 }
412             { end 10 }
413             { uses V{ 8 9 10 } }
414         }
415         T{ live-interval
416             { vreg V int-regs 3686454 }
417             { start 46 }
418             { end 49 }
419             { uses V{ 46 47 47 49 } }
420             { copy-from V int-regs 3686449 }
421         }
422         T{ live-interval
423             { vreg V int-regs 3686196 }
424             { start 6 }
425             { end 12 }
426             { uses V{ 6 12 } }
427         }
428         T{ live-interval
429             { vreg V int-regs 3686197 }
430             { start 7 }
431             { end 14 }
432             { uses V{ 7 13 14 } }
433         }
434         T{ live-interval
435             { vreg V int-regs 3686455 }
436             { start 48 }
437             { end 51 }
438             { uses V{ 48 51 } }
439         }
440         T{ live-interval
441             { vreg V int-regs 3686463 }
442             { start 52 }
443             { end 53 }
444             { uses V{ 52 53 } }
445         }
446         T{ live-interval
447             { vreg V int-regs 3686460 }
448             { start 49 }
449             { end 52 }
450             { uses V{ 49 50 50 52 } }
451             { copy-from V int-regs 3686454 }
452         }
453         T{ live-interval
454             { vreg V int-regs 3686461 }
455             { start 51 }
456             { end 71 }
457             { uses V{ 51 52 64 68 71 } }
458         }
459         T{ live-interval
460             { vreg V int-regs 3686464 }
461             { start 53 }
462             { end 54 }
463             { uses V{ 53 54 } }
464         }
465         T{ live-interval
466             { vreg V int-regs 3686465 }
467             { start 54 }
468             { end 76 }
469             { uses V{ 54 55 55 76 } }
470             { copy-from V int-regs 3686464 }
471         }
472         T{ live-interval
473             { vreg V int-regs 3686470 }
474             { start 58 }
475             { end 60 }
476             { uses V{ 58 59 59 60 } }
477             { copy-from V int-regs 3686469 }
478         }
479         T{ live-interval
480             { vreg V int-regs 3686469 }
481             { start 56 }
482             { end 58 }
483             { uses V{ 56 57 57 58 } }
484             { copy-from V int-regs 3686449 }
485         }
486         T{ live-interval
487             { vreg V int-regs 3686473 }
488             { start 60 }
489             { end 62 }
490             { uses V{ 60 61 61 62 } }
491             { copy-from V int-regs 3686470 }
492         }
493         T{ live-interval
494             { vreg V int-regs 3686479 }
495             { start 62 }
496             { end 64 }
497             { uses V{ 62 63 63 64 } }
498             { copy-from V int-regs 3686473 }
499         }
500         T{ live-interval
501             { vreg V int-regs 3686735 }
502             { start 78 }
503             { end 96 }
504             { uses V{ 78 79 79 96 } }
505             { copy-from V int-regs 3686372 }
506         }
507         T{ live-interval
508             { vreg V int-regs 3686482 }
509             { start 64 }
510             { end 65 }
511             { uses V{ 64 65 } }
512         }
513         T{ live-interval
514             { vreg V int-regs 3686483 }
515             { start 65 }
516             { end 66 }
517             { uses V{ 65 66 } }
518         }
519         T{ live-interval
520             { vreg V int-regs 3687510 }
521             { start 168 }
522             { end 171 }
523             { uses V{ 168 171 } }
524         }
525         T{ live-interval
526             { vreg V int-regs 3687511 }
527             { start 169 }
528             { end 176 }
529             { uses V{ 169 176 } }
530         }
531         T{ live-interval
532             { vreg V int-regs 3686484 }
533             { start 66 }
534             { end 75 }
535             { uses V{ 66 67 67 75 } }
536             { copy-from V int-regs 3686483 }
537         }
538         T{ live-interval
539             { vreg V int-regs 3687509 }
540             { start 162 }
541             { end 163 }
542             { uses V{ 162 163 } }
543         }
544         T{ live-interval
545             { vreg V int-regs 3686491 }
546             { start 68 }
547             { end 69 }
548             { uses V{ 68 69 } }
549         }
550         T{ live-interval
551             { vreg V int-regs 3687512 }
552             { start 170 }
553             { end 178 }
554             { uses V{ 170 177 178 } }
555         }
556         T{ live-interval
557             { vreg V int-regs 3687515 }
558             { start 172 }
559             { end 173 }
560             { uses V{ 172 173 } }
561         }
562         T{ live-interval
563             { vreg V int-regs 3686492 }
564             { start 69 }
565             { end 74 }
566             { uses V{ 69 70 70 74 } }
567             { copy-from V int-regs 3686491 }
568         }
569         T{ live-interval
570             { vreg V int-regs 3687778 }
571             { start 202 }
572             { end 208 }
573             { uses V{ 202 208 } }
574         }
575         T{ live-interval
576             { vreg V int-regs 3686499 }
577             { start 71 }
578             { end 72 }
579             { uses V{ 71 72 } }
580         }
581         T{ live-interval
582             { vreg V int-regs 3687520 }
583             { start 174 }
584             { end 175 }
585             { uses V{ 174 175 } }
586         }
587         T{ live-interval
588             { vreg V int-regs 3687779 }
589             { start 203 }
590             { end 209 }
591             { uses V{ 203 209 } }
592         }
593         T{ live-interval
594             { vreg V int-regs 3687782 }
595             { start 206 }
596             { end 207 }
597             { uses V{ 206 207 } }
598         }
599         T{ live-interval
600             { vreg V int-regs 3686503 }
601             { start 74 }
602             { end 75 }
603             { uses V{ 74 75 } }
604         }
605         T{ live-interval
606             { vreg V int-regs 3686500 }
607             { start 72 }
608             { end 74 }
609             { uses V{ 72 73 73 74 } }
610             { copy-from V int-regs 3686499 }
611         }
612         T{ live-interval
613             { vreg V int-regs 3687780 }
614             { start 204 }
615             { end 210 }
616             { uses V{ 204 210 } }
617         }
618         T{ live-interval
619             { vreg V int-regs 3686506 }
620             { start 75 }
621             { end 76 }
622             { uses V{ 75 76 } }
623         }
624         T{ live-interval
625             { vreg V int-regs 3687530 }
626             { start 185 }
627             { end 192 }
628             { uses V{ 185 192 } }
629         }
630         T{ live-interval
631             { vreg V int-regs 3687528 }
632             { start 183 }
633             { end 198 }
634             { uses V{ 183 198 } }
635         }
636         T{ live-interval
637             { vreg V int-regs 3687529 }
638             { start 184 }
639             { end 197 }
640             { uses V{ 184 197 } }
641         }
642         T{ live-interval
643             { vreg V int-regs 3687781 }
644             { start 205 }
645             { end 211 }
646             { uses V{ 205 211 } }
647         }
648         T{ live-interval
649             { vreg V int-regs 3687535 }
650             { start 187 }
651             { end 194 }
652             { uses V{ 187 194 } }
653         }
654         T{ live-interval
655             { vreg V int-regs 3686252 }
656             { start 9 }
657             { end 17 }
658             { uses V{ 9 15 17 } }
659         }
660         T{ live-interval
661             { vreg V int-regs 3686509 }
662             { start 76 }
663             { end 90 }
664             { uses V{ 76 87 90 } }
665         }
666         T{ live-interval
667             { vreg V int-regs 3687532 }
668             { start 186 }
669             { end 196 }
670             { uses V{ 186 196 } }
671         }
672         T{ live-interval
673             { vreg V int-regs 3687538 }
674             { start 188 }
675             { end 193 }
676             { uses V{ 188 193 } }
677         }
678         T{ live-interval
679             { vreg V int-regs 3687827 }
680             { start 217 }
681             { end 219 }
682             { uses V{ 217 219 } }
683         }
684         T{ live-interval
685             { vreg V int-regs 3687825 }
686             { start 215 }
687             { end 218 }
688             { uses V{ 215 216 218 } }
689         }
690         T{ live-interval
691             { vreg V int-regs 3687831 }
692             { start 218 }
693             { end 219 }
694             { uses V{ 218 219 } }
695         }
696         T{ live-interval
697             { vreg V int-regs 3686296 }
698             { start 16 }
699             { end 18 }
700             { uses V{ 16 18 } }
701         }
702         T{ live-interval
703             { vreg V int-regs 3686302 }
704             { start 29 }
705             { end 31 }
706             { uses V{ 29 31 } }
707         }
708         T{ live-interval
709             { vreg V int-regs 3687838 }
710             { start 231 }
711             { end 232 }
712             { uses V{ 231 232 } }
713         }
714         T{ live-interval
715             { vreg V int-regs 3686300 }
716             { start 26 }
717             { end 27 }
718             { uses V{ 26 27 } }
719         }
720         T{ live-interval
721             { vreg V int-regs 3686301 }
722             { start 27 }
723             { end 30 }
724             { uses V{ 27 28 28 30 } }
725             { copy-from V int-regs 3686300 }
726         }
727         T{ live-interval
728             { vreg V int-regs 3686306 }
729             { start 37 }
730             { end 93 }
731             { uses V{ 37 82 93 } }
732         }
733         T{ live-interval
734             { vreg V int-regs 3686307 }
735             { start 38 }
736             { end 88 }
737             { uses V{ 38 85 88 } }
738         }
739         T{ live-interval
740             { vreg V int-regs 3687837 }
741             { start 222 }
742             { end 223 }
743             { uses V{ 222 223 } }
744         }
745         T{ live-interval
746             { vreg V int-regs 3686305 }
747             { start 36 }
748             { end 81 }
749             { uses V{ 36 42 77 81 } }
750         }
751         T{ live-interval
752             { vreg V int-regs 3686310 }
753             { start 39 }
754             { end 95 }
755             { uses V{ 39 84 95 } }
756         }
757         T{ live-interval
758             { vreg V int-regs 3687836 }
759             { start 227 }
760             { end 228 }
761             { uses V{ 227 228 } }
762         }
763         T{ live-interval
764             { vreg V int-regs 3687839 }
765             { start 239 }
766             { end 246 }
767             { uses V{ 239 245 246 } }
768         }
769         T{ live-interval
770             { vreg V int-regs 3687841 }
771             { start 240 }
772             { end 241 }
773             { uses V{ 240 241 } }
774         }
775         T{ live-interval
776             { vreg V int-regs 3687845 }
777             { start 241 }
778             { end 243 }
779             { uses V{ 241 243 } }
780         }
781         T{ live-interval
782             { vreg V int-regs 3686315 }
783             { start 40 }
784             { end 94 }
785             { uses V{ 40 83 94 } }
786         }
787         T{ live-interval
788             { vreg V int-regs 3687846 }
789             { start 242 }
790             { end 245 }
791             { uses V{ 242 245 } }
792         }
793         T{ live-interval
794             { vreg V int-regs 3687849 }
795             { start 243 }
796             { end 245 }
797             { uses V{ 243 244 244 245 } }
798             { copy-from V int-regs 3687845 }
799         }
800         T{ live-interval
801             { vreg V int-regs 3687850 }
802             { start 245 }
803             { end 245 }
804             { uses V{ 245 } }
805         }
806         T{ live-interval
807             { vreg V int-regs 3687851 }
808             { start 246 }
809             { end 246 }
810             { uses V{ 246 } }
811         }
812         T{ live-interval
813             { vreg V int-regs 3687852 }
814             { start 246 }
815             { end 246 }
816             { uses V{ 246 } }
817         }
818         T{ live-interval
819             { vreg V int-regs 3687853 }
820             { start 247 }
821             { end 248 }
822             { uses V{ 247 248 } }
823         }
824         T{ live-interval
825             { vreg V int-regs 3687854 }
826             { start 249 }
827             { end 250 }
828             { uses V{ 249 250 } }
829         }
830         T{ live-interval
831             { vreg V int-regs 3687855 }
832             { start 258 }
833             { end 259 }
834             { uses V{ 258 259 } }
835         }
836         T{ live-interval
837             { vreg V int-regs 3687080 }
838             { start 280 }
839             { end 285 }
840             { uses V{ 280 285 } }
841         }
842         T{ live-interval
843             { vreg V int-regs 3687081 }
844             { start 281 }
845             { end 286 }
846             { uses V{ 281 286 } }
847         }
848         T{ live-interval
849             { vreg V int-regs 3687082 }
850             { start 282 }
851             { end 287 }
852             { uses V{ 282 287 } }
853         }
854         T{ live-interval
855             { vreg V int-regs 3687083 }
856             { start 283 }
857             { end 288 }
858             { uses V{ 283 288 } }
859         }
860         T{ live-interval
861             { vreg V int-regs 3687085 }
862             { start 284 }
863             { end 299 }
864             { uses V{ 284 285 286 287 288 296 299 } }
865         }
866         T{ live-interval
867             { vreg V int-regs 3687086 }
868             { start 284 }
869             { end 284 }
870             { uses V{ 284 } }
871         }
872         T{ live-interval
873             { vreg V int-regs 3687087 }
874             { start 289 }
875             { end 293 }
876             { uses V{ 289 293 } }
877         }
878         T{ live-interval
879             { vreg V int-regs 3687088 }
880             { start 290 }
881             { end 294 }
882             { uses V{ 290 294 } }
883         }
884         T{ live-interval
885             { vreg V int-regs 3687089 }
886             { start 291 }
887             { end 297 }
888             { uses V{ 291 297 } }
889         }
890         T{ live-interval
891             { vreg V int-regs 3687090 }
892             { start 292 }
893             { end 298 }
894             { uses V{ 292 298 } }
895         }
896         T{ live-interval
897             { vreg V int-regs 3687363 }
898             { start 118 }
899             { end 119 }
900             { uses V{ 118 119 } }
901         }
902         T{ live-interval
903             { vreg V int-regs 3686599 }
904             { start 77 }
905             { end 89 }
906             { uses V{ 77 86 89 } }
907         }
908         T{ live-interval
909             { vreg V int-regs 3687370 }
910             { start 131 }
911             { end 132 }
912             { uses V{ 131 132 } }
913         }
914         T{ live-interval
915             { vreg V int-regs 3687371 }
916             { start 138 }
917             { end 143 }
918             { uses V{ 138 143 } }
919         }
920         T{ live-interval
921             { vreg V int-regs 3687368 }
922             { start 127 }
923             { end 128 }
924             { uses V{ 127 128 } }
925         }
926         T{ live-interval
927             { vreg V int-regs 3687369 }
928             { start 122 }
929             { end 123 }
930             { uses V{ 122 123 } }
931         }
932         T{ live-interval
933             { vreg V int-regs 3687373 }
934             { start 139 }
935             { end 140 }
936             { uses V{ 139 140 } }
937         }
938         T{ live-interval
939             { vreg V int-regs 3686352 }
940             { start 41 }
941             { end 91 }
942             { uses V{ 41 43 79 91 } }
943         }
944         T{ live-interval
945             { vreg V int-regs 3687377 }
946             { start 140 }
947             { end 141 }
948             { uses V{ 140 141 } }
949         }
950         T{ live-interval
951             { vreg V int-regs 3687382 }
952             { start 143 }
953             { end 143 }
954             { uses V{ 143 } }
955         }
956         T{ live-interval
957             { vreg V int-regs 3687383 }
958             { start 144 }
959             { end 161 }
960             { uses V{ 144 159 161 } }
961         }
962         T{ live-interval
963             { vreg V int-regs 3687380 }
964             { start 141 }
965             { end 143 }
966             { uses V{ 141 142 142 143 } }
967             { copy-from V int-regs 3687377 }
968         }
969         T{ live-interval
970             { vreg V int-regs 3687381 }
971             { start 143 }
972             { end 160 }
973             { uses V{ 143 160 } }
974         }
975         T{ live-interval
976             { vreg V int-regs 3687384 }
977             { start 145 }
978             { end 158 }
979             { uses V{ 145 158 } }
980         }
981         T{ live-interval
982             { vreg V int-regs 3687385 }
983             { start 146 }
984             { end 157 }
985             { uses V{ 146 157 } }
986         }
987         T{ live-interval
988             { vreg V int-regs 3687640 }
989             { start 189 }
990             { end 191 }
991             { uses V{ 189 191 } }
992         }
993         T{ live-interval
994             { vreg V int-regs 3687388 }
995             { start 147 }
996             { end 152 }
997             { uses V{ 147 152 } }
998         }
999         T{ live-interval
1000             { vreg V int-regs 3687393 }
1001             { start 148 }
1002             { end 153 }
1003             { uses V{ 148 153 } }
1004         }
1005         T{ live-interval
1006             { vreg V int-regs 3687398 }
1007             { start 149 }
1008             { end 154 }
1009             { uses V{ 149 154 } }
1010         }
1011         T{ live-interval
1012             { vreg V int-regs 3686372 }
1013             { start 42 }
1014             { end 92 }
1015             { uses V{ 42 45 78 80 92 } }
1016         }
1017         T{ live-interval
1018             { vreg V int-regs 3687140 }
1019             { start 293 }
1020             { end 295 }
1021             { uses V{ 293 294 294 295 } }
1022             { copy-from V int-regs 3687087 }
1023         }
1024         T{ live-interval
1025             { vreg V int-regs 3687403 }
1026             { start 150 }
1027             { end 155 }
1028             { uses V{ 150 155 } }
1029         }
1030         T{ live-interval
1031             { vreg V int-regs 3687150 }
1032             { start 304 }
1033             { end 306 }
1034             { uses V{ 304 306 } }
1035         }
1036         T{ live-interval
1037             { vreg V int-regs 3687151 }
1038             { start 305 }
1039             { end 307 }
1040             { uses V{ 305 307 } }
1041         }
1042         T{ live-interval
1043             { vreg V int-regs 3687408 }
1044             { start 151 }
1045             { end 156 }
1046             { uses V{ 151 156 } }
1047         }
1048         T{ live-interval
1049             { vreg V int-regs 3687153 }
1050             { start 312 }
1051             { end 313 }
1052             { uses V{ 312 313 } }
1053         }
1054         T{ live-interval
1055             { vreg V int-regs 3686902 }
1056             { start 267 }
1057             { end 272 }
1058             { uses V{ 267 272 } }
1059         }
1060         T{ live-interval
1061             { vreg V int-regs 3686903 }
1062             { start 268 }
1063             { end 273 }
1064             { uses V{ 268 273 } }
1065         }
1066         T{ live-interval
1067             { vreg V int-regs 3686900 }
1068             { start 265 }
1069             { end 270 }
1070             { uses V{ 265 270 } }
1071         }
1072         T{ live-interval
1073             { vreg V int-regs 3686901 }
1074             { start 266 }
1075             { end 271 }
1076             { uses V{ 266 271 } }
1077         }
1078         T{ live-interval
1079             { vreg V int-regs 3687162 }
1080             { start 100 }
1081             { end 119 }
1082             { uses V{ 100 114 117 119 } }
1083         }
1084         T{ live-interval
1085             { vreg V int-regs 3687163 }
1086             { start 101 }
1087             { end 118 }
1088             { uses V{ 101 115 116 118 } }
1089         }
1090         T{ live-interval
1091             { vreg V int-regs 3686904 }
1092             { start 269 }
1093             { end 274 }
1094             { uses V{ 269 274 } }
1095         }
1096         T{ live-interval
1097             { vreg V int-regs 3687166 }
1098             { start 104 }
1099             { end 110 }
1100             { uses V{ 104 110 } }
1101         }
1102         T{ live-interval
1103             { vreg V int-regs 3687167 }
1104             { start 105 }
1105             { end 111 }
1106             { uses V{ 105 111 } }
1107         }
1108         T{ live-interval
1109             { vreg V int-regs 3687164 }
1110             { start 102 }
1111             { end 108 }
1112             { uses V{ 102 108 } }
1113         }
1114         T{ live-interval
1115             { vreg V int-regs 3687165 }
1116             { start 103 }
1117             { end 109 }
1118             { uses V{ 103 109 } }
1119         }
1120     }
1121     { { int-regs { 0 1 2 3 4 } } }
1122     allocate-registers drop
1123 ] unit-test
1124
1125 ! A reduction of the above
1126 [ ] [
1127     {
1128         T{ live-interval
1129             { vreg V int-regs 6449 }
1130             { start 44 }
1131             { end 56 }
1132             { uses V{ 44 45 46 56 } }
1133         }
1134         T{ live-interval
1135             { vreg V int-regs 6454 }
1136             { start 46 }
1137             { end 49 }
1138             { uses V{ 46 47 49 } }
1139         }
1140         T{ live-interval
1141             { vreg V int-regs 6455 }
1142             { start 48 }
1143             { end 51 }
1144             { uses V{ 48 51 } }
1145         }
1146         T{ live-interval
1147             { vreg V int-regs 6460 }
1148             { start 49 }
1149             { end 52 }
1150             { uses V{ 49 50 52 } }
1151         }
1152         T{ live-interval
1153             { vreg V int-regs 6461 }
1154             { start 51 }
1155             { end 71 }
1156             { uses V{ 51 52 64 68 71 } }
1157         }
1158         T{ live-interval
1159             { vreg V int-regs 6464 }
1160             { start 53 }
1161             { end 54 }
1162             { uses V{ 53 54 } }
1163         }
1164         T{ live-interval
1165             { vreg V int-regs 6470 }
1166             { start 58 }
1167             { end 60 }
1168             { uses V{ 58 59 60 } }
1169         }
1170         T{ live-interval
1171             { vreg V int-regs 6469 }
1172             { start 56 }
1173             { end 58 }
1174             { uses V{ 56 57 58 } }
1175         }
1176         T{ live-interval
1177             { vreg V int-regs 6473 }
1178             { start 60 }
1179             { end 62 }
1180             { uses V{ 60 61 62 } }
1181         }
1182         T{ live-interval
1183             { vreg V int-regs 6479 }
1184             { start 62 }
1185             { end 64 }
1186             { uses V{ 62 63 64 } }
1187         }
1188         T{ live-interval
1189             { vreg V int-regs 6735 }
1190             { start 78 }
1191             { end 96 }
1192             { uses V{ 78 79 96 } }
1193             { copy-from V int-regs 6372 }
1194         }
1195         T{ live-interval
1196             { vreg V int-regs 6483 }
1197             { start 65 }
1198             { end 66 }
1199             { uses V{ 65 66 } }
1200         }
1201         T{ live-interval
1202             { vreg V int-regs 7845 }
1203             { start 91 }
1204             { end 93 }
1205             { uses V{ 91 93 } }
1206         }
1207         T{ live-interval
1208             { vreg V int-regs 6372 }
1209             { start 42 }
1210             { end 92 }
1211             { uses V{ 42 45 78 80 92 } }
1212         }
1213     }
1214     { { int-regs { 0 1 2 3 } } }
1215     allocate-registers drop
1216 ] unit-test