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