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
6 compiler.cfg.instructions
8 compiler.cfg.linear-scan
9 compiler.cfg.linear-scan.live-intervals
10 compiler.cfg.linear-scan.allocation
11 compiler.cfg.linear-scan.debugger ;
15 { vreg T{ vreg { reg-class int-regs } { n 2 } } }
18 { uses V{ 0 1 3 7 10 } }
25 { vreg T{ vreg { reg-class int-regs } { n 2 } } }
28 { uses V{ 0 1 3 4 10 } }
35 { vreg T{ vreg { reg-class int-regs } { n 2 } } }
38 { uses V{ 0 1 3 4 10 } }
40 100 [ >= ] find-use nip
45 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
51 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
58 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
67 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
73 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
80 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
89 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
97 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
100 { uses V{ 1 3 7 10 15 } }
103 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
109 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
116 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
126 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
129 { uses V{ 5 10 15 } }
132 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
142 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
145 { uses V{ 5 10 15 } }
148 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
158 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
164 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
174 T{ live-interval { vreg T{ vreg { n 1 } { reg-class int-regs } } } { start 0 } { end 100 } { uses V{ 0 100 } } }
176 H{ { int-regs { "A" } } }
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 } } }
185 H{ { int-regs { "A" } } }
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 } } }
194 H{ { int-regs { "A" } } }
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 } } }
203 H{ { int-regs { "A" } } }
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 } } }
212 H{ { int-regs { "A" } } }
220 SYMBOL: max-registers
227 available get keys dup empty? [ "Oops" throw ] when
229 dup taken get nth 1 + max-registers get = [
230 dup available get delete-at
232 dup taken get [ 1 + ] change-nth
235 : random-live-intervals ( num-intervals max-uses max-registers max-insns -- seq )
240 max-insns get [ 0 ] replicate taken set
241 max-insns get [ dup ] H{ } map>assoc available set
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>> peek >>end
251 : random-test ( num-intervals max-uses max-registers max-insns -- )
252 over [ random-live-intervals ] dip int-regs associate check-linear-scan ;
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
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
265 USING: math.private compiler.cfg.debugger ;
267 [ ] [ [ float+ float>fixnum 3 fixnum*fast ] test-mr first linear-scan drop ] unit-test
272 T{ vreg f int-regs 1 }
275 T{ vreg f int-regs 2 }
278 1array (linear-scan) first regs>> values all-equal?
284 { vreg T{ vreg { reg-class int-regs } { n 1 } } }
290 { vreg T{ vreg { reg-class int-regs } { n 2 } } }
296 { vreg T{ vreg { reg-class int-regs } { n 3 } } }
302 H{ { int-regs { "A" "B" } } }
304 first split-before>> [ start>> ] [ end>> ] bi
307 ! Coalescing interacted badly with splitting
311 { vreg V int-regs 70 }
314 { uses V{ 14 15 16 17 } }
315 { copy-from V int-regs 67 }
318 { vreg V int-regs 67 }
324 { vreg V int-regs 30 }
327 { uses V{ 4 12 16 17 18 } }
330 { vreg V int-regs 27 }
336 { vreg V int-regs 59 }
339 { uses V{ 10 11 12 18 } }
340 { copy-from V int-regs 56 }
343 { vreg V int-regs 60 }
349 { vreg V int-regs 56 }
355 { { int-regs { 0 1 2 3 } } }
356 allocate-registers drop
362 { vreg V int-regs 3687168 }
365 { uses V{ 106 112 } }
368 { vreg V int-regs 3687169 }
371 { uses V{ 107 113 } }
374 { vreg V int-regs 3687727 }
377 { uses V{ 190 195 198 } }
380 { vreg V int-regs 3686445 }
386 { vreg V int-regs 3686195 }
392 { vreg V int-regs 3686449 }
395 { uses V{ 44 45 45 46 56 } }
396 { copy-from V int-regs 3686445 }
399 { vreg V int-regs 3686198 }
405 { vreg V int-regs 3686454 }
408 { uses V{ 46 47 47 49 } }
409 { copy-from V int-regs 3686449 }
412 { vreg V int-regs 3686196 }
418 { vreg V int-regs 3686197 }
421 { uses V{ 7 13 14 } }
424 { vreg V int-regs 3686455 }
430 { vreg V int-regs 3686463 }
436 { vreg V int-regs 3686460 }
439 { uses V{ 49 50 50 52 } }
440 { copy-from V int-regs 3686454 }
443 { vreg V int-regs 3686461 }
446 { uses V{ 51 52 64 68 71 } }
449 { vreg V int-regs 3686464 }
455 { vreg V int-regs 3686465 }
458 { uses V{ 54 55 55 76 } }
459 { copy-from V int-regs 3686464 }
462 { vreg V int-regs 3686470 }
465 { uses V{ 58 59 59 60 } }
466 { copy-from V int-regs 3686469 }
469 { vreg V int-regs 3686469 }
472 { uses V{ 56 57 57 58 } }
473 { copy-from V int-regs 3686449 }
476 { vreg V int-regs 3686473 }
479 { uses V{ 60 61 61 62 } }
480 { copy-from V int-regs 3686470 }
483 { vreg V int-regs 3686479 }
486 { uses V{ 62 63 63 64 } }
487 { copy-from V int-regs 3686473 }
490 { vreg V int-regs 3686735 }
493 { uses V{ 78 79 79 96 } }
494 { copy-from V int-regs 3686372 }
497 { vreg V int-regs 3686482 }
503 { vreg V int-regs 3686483 }
509 { vreg V int-regs 3687510 }
512 { uses V{ 168 171 } }
515 { vreg V int-regs 3687511 }
518 { uses V{ 169 176 } }
521 { vreg V int-regs 3686484 }
524 { uses V{ 66 67 67 75 } }
525 { copy-from V int-regs 3686483 }
528 { vreg V int-regs 3687509 }
531 { uses V{ 162 163 } }
534 { vreg V int-regs 3686491 }
540 { vreg V int-regs 3687512 }
543 { uses V{ 170 177 178 } }
546 { vreg V int-regs 3687515 }
549 { uses V{ 172 173 } }
552 { vreg V int-regs 3686492 }
555 { uses V{ 69 70 70 74 } }
556 { copy-from V int-regs 3686491 }
559 { vreg V int-regs 3687778 }
562 { uses V{ 202 208 } }
565 { vreg V int-regs 3686499 }
571 { vreg V int-regs 3687520 }
574 { uses V{ 174 175 } }
577 { vreg V int-regs 3687779 }
580 { uses V{ 203 209 } }
583 { vreg V int-regs 3687782 }
586 { uses V{ 206 207 } }
589 { vreg V int-regs 3686503 }
595 { vreg V int-regs 3686500 }
598 { uses V{ 72 73 73 74 } }
599 { copy-from V int-regs 3686499 }
602 { vreg V int-regs 3687780 }
605 { uses V{ 204 210 } }
608 { vreg V int-regs 3686506 }
614 { vreg V int-regs 3687530 }
617 { uses V{ 185 192 } }
620 { vreg V int-regs 3687528 }
623 { uses V{ 183 198 } }
626 { vreg V int-regs 3687529 }
629 { uses V{ 184 197 } }
632 { vreg V int-regs 3687781 }
635 { uses V{ 205 211 } }
638 { vreg V int-regs 3687535 }
641 { uses V{ 187 194 } }
644 { vreg V int-regs 3686252 }
647 { uses V{ 9 15 17 } }
650 { vreg V int-regs 3686509 }
653 { uses V{ 76 87 90 } }
656 { vreg V int-regs 3687532 }
659 { uses V{ 186 196 } }
662 { vreg V int-regs 3687538 }
665 { uses V{ 188 193 } }
668 { vreg V int-regs 3687827 }
671 { uses V{ 217 219 } }
674 { vreg V int-regs 3687825 }
677 { uses V{ 215 216 218 } }
680 { vreg V int-regs 3687831 }
683 { uses V{ 218 219 } }
686 { vreg V int-regs 3686296 }
692 { vreg V int-regs 3686302 }
698 { vreg V int-regs 3687838 }
701 { uses V{ 231 232 } }
704 { vreg V int-regs 3686300 }
710 { vreg V int-regs 3686301 }
713 { uses V{ 27 28 28 30 } }
714 { copy-from V int-regs 3686300 }
717 { vreg V int-regs 3686306 }
720 { uses V{ 37 82 93 } }
723 { vreg V int-regs 3686307 }
726 { uses V{ 38 85 88 } }
729 { vreg V int-regs 3687837 }
732 { uses V{ 222 223 } }
735 { vreg V int-regs 3686305 }
738 { uses V{ 36 42 77 81 } }
741 { vreg V int-regs 3686310 }
744 { uses V{ 39 84 95 } }
747 { vreg V int-regs 3687836 }
750 { uses V{ 227 228 } }
753 { vreg V int-regs 3687839 }
756 { uses V{ 239 245 246 } }
759 { vreg V int-regs 3687841 }
762 { uses V{ 240 241 } }
765 { vreg V int-regs 3687845 }
768 { uses V{ 241 243 } }
771 { vreg V int-regs 3686315 }
774 { uses V{ 40 83 94 } }
777 { vreg V int-regs 3687846 }
780 { uses V{ 242 245 } }
783 { vreg V int-regs 3687849 }
786 { uses V{ 243 244 244 245 } }
787 { copy-from V int-regs 3687845 }
790 { vreg V int-regs 3687850 }
796 { vreg V int-regs 3687851 }
802 { vreg V int-regs 3687852 }
808 { vreg V int-regs 3687853 }
811 { uses V{ 247 248 } }
814 { vreg V int-regs 3687854 }
817 { uses V{ 249 250 } }
820 { vreg V int-regs 3687855 }
823 { uses V{ 258 259 } }
826 { vreg V int-regs 3687080 }
829 { uses V{ 280 285 } }
832 { vreg V int-regs 3687081 }
835 { uses V{ 281 286 } }
838 { vreg V int-regs 3687082 }
841 { uses V{ 282 287 } }
844 { vreg V int-regs 3687083 }
847 { uses V{ 283 288 } }
850 { vreg V int-regs 3687085 }
853 { uses V{ 284 285 286 287 288 296 299 } }
856 { vreg V int-regs 3687086 }
862 { vreg V int-regs 3687087 }
865 { uses V{ 289 293 } }
868 { vreg V int-regs 3687088 }
871 { uses V{ 290 294 } }
874 { vreg V int-regs 3687089 }
877 { uses V{ 291 297 } }
880 { vreg V int-regs 3687090 }
883 { uses V{ 292 298 } }
886 { vreg V int-regs 3687363 }
889 { uses V{ 118 119 } }
892 { vreg V int-regs 3686599 }
895 { uses V{ 77 86 89 } }
898 { vreg V int-regs 3687370 }
901 { uses V{ 131 132 } }
904 { vreg V int-regs 3687371 }
907 { uses V{ 138 143 } }
910 { vreg V int-regs 3687368 }
913 { uses V{ 127 128 } }
916 { vreg V int-regs 3687369 }
919 { uses V{ 122 123 } }
922 { vreg V int-regs 3687373 }
925 { uses V{ 139 140 } }
928 { vreg V int-regs 3686352 }
931 { uses V{ 41 43 79 91 } }
934 { vreg V int-regs 3687377 }
937 { uses V{ 140 141 } }
940 { vreg V int-regs 3687382 }
946 { vreg V int-regs 3687383 }
949 { uses V{ 144 159 161 } }
952 { vreg V int-regs 3687380 }
955 { uses V{ 141 142 142 143 } }
956 { copy-from V int-regs 3687377 }
959 { vreg V int-regs 3687381 }
962 { uses V{ 143 160 } }
965 { vreg V int-regs 3687384 }
968 { uses V{ 145 158 } }
971 { vreg V int-regs 3687385 }
974 { uses V{ 146 157 } }
977 { vreg V int-regs 3687640 }
980 { uses V{ 189 191 } }
983 { vreg V int-regs 3687388 }
986 { uses V{ 147 152 } }
989 { vreg V int-regs 3687393 }
992 { uses V{ 148 153 } }
995 { vreg V int-regs 3687398 }
998 { uses V{ 149 154 } }
1001 { vreg V int-regs 3686372 }
1004 { uses V{ 42 45 78 80 92 } }
1007 { vreg V int-regs 3687140 }
1010 { uses V{ 293 294 294 295 } }
1011 { copy-from V int-regs 3687087 }
1014 { vreg V int-regs 3687403 }
1017 { uses V{ 150 155 } }
1020 { vreg V int-regs 3687150 }
1023 { uses V{ 304 306 } }
1026 { vreg V int-regs 3687151 }
1029 { uses V{ 305 307 } }
1032 { vreg V int-regs 3687408 }
1035 { uses V{ 151 156 } }
1038 { vreg V int-regs 3687153 }
1041 { uses V{ 312 313 } }
1044 { vreg V int-regs 3686902 }
1047 { uses V{ 267 272 } }
1050 { vreg V int-regs 3686903 }
1053 { uses V{ 268 273 } }
1056 { vreg V int-regs 3686900 }
1059 { uses V{ 265 270 } }
1062 { vreg V int-regs 3686901 }
1065 { uses V{ 266 271 } }
1068 { vreg V int-regs 3687162 }
1071 { uses V{ 100 114 117 119 } }
1074 { vreg V int-regs 3687163 }
1077 { uses V{ 101 115 116 118 } }
1080 { vreg V int-regs 3686904 }
1083 { uses V{ 269 274 } }
1086 { vreg V int-regs 3687166 }
1089 { uses V{ 104 110 } }
1092 { vreg V int-regs 3687167 }
1095 { uses V{ 105 111 } }
1098 { vreg V int-regs 3687164 }
1101 { uses V{ 102 108 } }
1104 { vreg V int-regs 3687165 }
1107 { uses V{ 103 109 } }
1110 { { int-regs { 0 1 2 3 4 } } }
1111 allocate-registers drop
1114 ! A reduction of the above
1118 { vreg V int-regs 6449 }
1121 { uses V{ 44 45 46 56 } }
1124 { vreg V int-regs 6454 }
1127 { uses V{ 46 47 49 } }
1130 { vreg V int-regs 6455 }
1136 { vreg V int-regs 6460 }
1139 { uses V{ 49 50 52 } }
1142 { vreg V int-regs 6461 }
1145 { uses V{ 51 52 64 68 71 } }
1148 { vreg V int-regs 6464 }
1154 { vreg V int-regs 6470 }
1157 { uses V{ 58 59 60 } }
1160 { vreg V int-regs 6469 }
1163 { uses V{ 56 57 58 } }
1166 { vreg V int-regs 6473 }
1169 { uses V{ 60 61 62 } }
1172 { vreg V int-regs 6479 }
1175 { uses V{ 62 63 64 } }
1178 { vreg V int-regs 6735 }
1181 { uses V{ 78 79 96 } }
1182 { copy-from V int-regs 6372 }
1185 { vreg V int-regs 6483 }
1191 { vreg V int-regs 7845 }
1197 { vreg V int-regs 6372 }
1200 { uses V{ 42 45 78 80 92 } }
1203 { { int-regs { 0 1 2 3 } } }
1204 allocate-registers drop