1 USING: combinators compiler.cfg.gvn compiler.cfg.instructions
2 compiler.cfg.registers compiler.cfg.debugger
3 compiler.cfg.comparisons cpu.architecture tools.test kernel
4 math combinators.short-circuit accessors sequences
5 compiler.cfg.predecessors compiler.cfg.utilities locals compiler.cfg.dce
6 compiler.cfg.ssa.destruction compiler.cfg.loop-detection
7 compiler.cfg.representations compiler.cfg assocs vectors arrays
8 layouts literals namespaces alien compiler.cfg.gvn.simd system ;
9 QUALIFIED-WITH: alien.c-types c
10 IN: compiler.cfg.gvn.tests
12 : trim-temps ( insns -- insns )
17 [ ##compare-integer? ]
18 [ ##compare-integer-imm? ]
19 [ ##compare-float-unordered? ]
20 [ ##compare-float-ordered? ]
24 [ ##test-vector-branch? ]
25 } 1|| [ f >>temp ] when
28 : value-number-bb ( insns -- insns' )
32 0 get instructions>> ;
34 ! Folding constants together
37 T{ ##load-reference f 0 0.0 }
38 T{ ##load-reference f 1 -0.0 }
42 T{ ##load-reference f 0 0.0 }
43 T{ ##load-reference f 1 -0.0 }
49 T{ ##load-reference f 0 0.0 }
50 T{ ##copy f 1 0 any-rep }
54 T{ ##load-reference f 0 0.0 }
55 T{ ##load-reference f 1 0.0 }
61 T{ ##load-reference f 0 t }
62 T{ ##copy f 1 0 any-rep }
66 T{ ##load-reference f 0 t }
67 T{ ##load-reference f 1 t }
71 ! ##load-reference/##replace fusion
75 T{ ##load-integer f 0 10 }
76 T{ ##replace-imm f 10 D 0 }
80 T{ ##load-integer f 0 10 }
81 T{ ##replace f 0 D 0 }
87 T{ ##load-reference f 0 f }
88 T{ ##replace-imm f f D 0 }
92 T{ ##load-reference f 0 f }
93 T{ ##replace f 0 D 0 }
101 T{ ##load-reference f 0 + }
102 T{ ##replace-imm f + D 0 }
106 T{ ##load-reference f 0 + }
107 T{ ##replace f 0 D 0 }
115 T{ ##load-integer f 0 10,000,000,000 }
116 T{ ##replace f 0 D 0 }
120 T{ ##load-integer f 0 10,000,000,000 }
121 T{ ##replace f 0 D 0 }
128 T{ ##load-integer f 0 0x7fffffff }
129 T{ ##replace f 0 D 0 }
133 T{ ##load-integer f 0 0x7fffffff }
134 T{ ##replace f 0 D 0 }
139 ! Double compare elimination
144 T{ ##compare f 4 2 1 cc= }
145 T{ ##copy f 6 4 any-rep }
146 T{ ##replace f 4 D 0 }
152 T{ ##compare f 4 2 1 cc= }
153 T{ ##compare-imm f 6 4 f cc/= }
154 T{ ##replace f 6 D 0 }
155 } value-number-bb trim-temps
161 T{ ##compare-imm f 2 1 16 cc= }
162 T{ ##copy f 3 2 any-rep }
163 T{ ##replace f 2 D 0 }
168 T{ ##compare-imm f 2 1 16 cc= }
169 T{ ##compare-imm f 3 2 f cc/= }
170 T{ ##replace f 3 D 0 }
171 } value-number-bb trim-temps
178 T{ ##compare-integer f 4 2 1 cc> }
179 T{ ##copy f 6 4 any-rep }
180 T{ ##replace f 4 D 0 }
186 T{ ##compare-integer f 4 2 1 cc> }
187 T{ ##compare-imm f 6 4 f cc/= }
188 T{ ##replace f 6 D 0 }
189 } value-number-bb trim-temps
196 T{ ##compare-integer f 4 2 1 cc<= }
197 T{ ##compare-integer f 6 2 1 cc/<= }
198 T{ ##replace f 6 D 0 }
204 T{ ##compare-integer f 4 2 1 cc<= }
205 T{ ##compare-imm f 6 4 f cc= }
206 T{ ##replace f 6 D 0 }
207 } value-number-bb trim-temps
213 T{ ##compare-integer-imm f 2 1 100 cc<= }
214 T{ ##compare-integer-imm f 3 1 100 cc/<= }
215 T{ ##replace f 3 D 0 }
220 T{ ##compare-integer-imm f 2 1 100 cc<= }
221 T{ ##compare-imm f 3 2 f cc= }
222 T{ ##replace f 3 D 0 }
223 } value-number-bb trim-temps
230 T{ ##compare-float-unordered f 12 8 9 cc< }
231 T{ ##compare-float-unordered f 14 8 9 cc/< }
232 T{ ##replace f 14 D 0 }
238 T{ ##compare-float-unordered f 12 8 9 cc< }
239 T{ ##compare-imm f 14 12 f cc= }
240 T{ ##replace f 14 D 0 }
241 } value-number-bb trim-temps
246 T{ ##peek f 29 D -1 }
247 T{ ##peek f 30 D -2 }
248 T{ ##compare f 33 29 30 cc= }
249 T{ ##compare-branch f 29 30 cc= }
253 T{ ##peek f 29 D -1 }
254 T{ ##peek f 30 D -2 }
255 T{ ##compare f 33 29 30 cc= }
256 T{ ##compare-imm-branch f 33 f cc/= }
257 } value-number-bb trim-temps
262 T{ ##peek f 29 D -1 }
263 T{ ##peek f 30 D -2 }
264 T{ ##compare-integer f 33 29 30 cc<= }
265 T{ ##compare-integer-branch f 29 30 cc<= }
269 T{ ##peek f 29 D -1 }
270 T{ ##peek f 30 D -2 }
271 T{ ##compare-integer f 33 29 30 cc<= }
272 T{ ##compare-imm-branch f 33 f cc/= }
273 } value-number-bb trim-temps
278 T{ ##peek f 29 D -1 }
279 T{ ##peek f 30 D -2 }
280 T{ ##test f 33 29 30 cc= }
281 T{ ##test-branch f 29 30 cc= }
285 T{ ##peek f 29 D -1 }
286 T{ ##peek f 30 D -2 }
287 T{ ##test f 33 29 30 cc= }
288 T{ ##compare-imm-branch f 33 f cc/= }
289 } value-number-bb trim-temps
294 T{ ##peek f 29 D -1 }
295 T{ ##test-imm f 33 29 30 cc= }
296 T{ ##test-imm-branch f 29 30 cc= }
300 T{ ##peek f 29 D -1 }
301 T{ ##test-imm f 33 29 30 cc= }
302 T{ ##compare-imm-branch f 33 f cc/= }
303 } value-number-bb trim-temps
309 T{ ##test-vector f 2 1 f float-4-rep vcc-any }
310 T{ ##test-vector-branch f 1 f float-4-rep vcc-any }
315 T{ ##test-vector f 2 1 f float-4-rep vcc-any }
316 T{ ##compare-imm-branch f 2 f cc/= }
317 } value-number-bb trim-temps
324 T{ ##compare-imm f 2 1 + cc= }
325 T{ ##compare-imm-branch f 1 + cc= }
330 T{ ##compare-imm f 2 1 + cc= }
331 T{ ##compare-imm-branch f 2 f cc/= }
332 } value-number-bb trim-temps
336 ! Immediate operand fusion
340 T{ ##load-integer f 1 100 }
341 T{ ##add-imm f 2 0 100 }
346 T{ ##load-integer f 1 100 }
354 T{ ##load-integer f 1 100 }
355 T{ ##add-imm f 2 0 100 }
360 T{ ##load-integer f 1 100 }
368 T{ ##load-integer f 1 100 }
369 T{ ##add-imm f 2 0 -100 }
374 T{ ##load-integer f 1 100 }
382 T{ ##load-integer f 1 0 }
394 T{ ##load-integer f 1 100 }
395 T{ ##mul-imm f 2 0 100 }
400 T{ ##load-integer f 1 100 }
408 T{ ##load-integer f 1 100 }
409 T{ ##mul-imm f 2 0 100 }
414 T{ ##load-integer f 1 100 }
422 T{ ##shl-imm f 2 1 3 }
427 T{ ##mul-imm f 2 1 8 }
434 T{ ##load-integer f 1 -1 }
440 T{ ##load-integer f 1 -1 }
448 T{ ##load-integer f 1 -1 }
454 T{ ##load-integer f 1 -1 }
462 T{ ##load-integer f 1 0 }
468 T{ ##load-integer f 1 0 }
476 T{ ##load-integer f 1 0 }
478 T{ ##copy f 3 0 any-rep }
483 T{ ##load-integer f 1 0 }
493 T{ ##copy f 2 0 any-rep }
507 T{ ##copy f 2 0 any-rep }
520 T{ ##load-integer f 1 100 }
521 T{ ##and-imm f 2 0 100 }
526 T{ ##load-integer f 1 100 }
534 T{ ##load-integer f 1 100 }
535 T{ ##and-imm f 2 0 100 }
540 T{ ##load-integer f 1 100 }
548 T{ ##load-integer f 1 100 }
549 T{ ##or-imm f 2 0 100 }
554 T{ ##load-integer f 1 100 }
562 T{ ##load-integer f 1 100 }
563 T{ ##or-imm f 2 0 100 }
568 T{ ##load-integer f 1 100 }
576 T{ ##load-integer f 1 100 }
577 T{ ##xor-imm f 2 0 100 }
582 T{ ##load-integer f 1 100 }
590 T{ ##load-integer f 1 100 }
591 T{ ##xor-imm f 2 0 100 }
596 T{ ##load-integer f 1 100 }
604 T{ ##load-integer f 1 100 }
605 T{ ##compare-imm f 2 0 100 cc= }
610 T{ ##load-integer f 1 100 }
611 T{ ##compare f 2 0 1 cc= }
612 } value-number-bb trim-temps
618 T{ ##load-integer f 1 100 }
619 T{ ##compare-integer-imm f 2 0 100 cc<= }
624 T{ ##load-integer f 1 100 }
625 T{ ##compare-integer f 2 0 1 cc<= }
626 } value-number-bb trim-temps
633 T{ ##load-reference f 1 + }
634 T{ ##compare-imm f 2 0 + cc= }
639 T{ ##load-reference f 1 + }
640 T{ ##compare f 2 0 1 cc= }
641 } value-number-bb trim-temps
647 T{ ##load-reference f 1 + }
648 T{ ##compare-imm-branch f 0 + cc= }
653 T{ ##load-reference f 1 + }
654 T{ ##compare-branch f 0 1 cc= }
655 } value-number-bb trim-temps
663 T{ ##load-reference f 1 3.5 }
664 T{ ##compare f 2 0 1 cc= }
669 T{ ##load-reference f 1 3.5 }
670 T{ ##compare f 2 0 1 cc= }
671 } value-number-bb trim-temps
677 T{ ##load-reference f 1 3.5 }
678 T{ ##compare-branch f 0 1 cc= }
683 T{ ##load-reference f 1 3.5 }
684 T{ ##compare-branch f 0 1 cc= }
685 } value-number-bb trim-temps
692 T{ ##load-integer f 1 100 }
693 T{ ##compare-integer-imm f 2 0 100 cc>= }
698 T{ ##load-integer f 1 100 }
699 T{ ##compare-integer f 2 1 0 cc<= }
700 } value-number-bb trim-temps
706 T{ ##load-integer f 1 100 }
707 T{ ##compare-integer-imm-branch f 0 100 cc<= }
712 T{ ##load-integer f 1 100 }
713 T{ ##compare-integer-branch f 0 1 cc<= }
720 T{ ##load-integer f 1 100 }
721 T{ ##compare-integer-imm-branch f 0 100 cc>= }
726 T{ ##load-integer f 1 100 }
727 T{ ##compare-integer-branch f 1 0 cc<= }
728 } value-number-bb trim-temps
734 T{ ##load-integer f 1 100 }
735 T{ ##load-integer f 2 200 }
736 T{ ##load-reference f 3 t }
740 T{ ##load-integer f 1 100 }
741 T{ ##load-integer f 2 200 }
742 T{ ##compare-integer f 3 1 2 cc<= }
743 } value-number-bb trim-temps
748 T{ ##load-integer f 1 100 }
749 T{ ##load-integer f 2 200 }
750 T{ ##load-reference f 3 f }
754 T{ ##load-integer f 1 100 }
755 T{ ##load-integer f 2 200 }
756 T{ ##compare-integer f 3 1 2 cc= }
757 } value-number-bb trim-temps
762 T{ ##load-integer f 1 100 }
763 T{ ##load-reference f 2 f }
767 T{ ##load-integer f 1 100 }
768 T{ ##compare-integer-imm f 2 1 123 cc= }
769 } value-number-bb trim-temps
774 T{ ##load-integer f 1 10 }
775 T{ ##load-integer f 2 20 }
776 T{ ##load-reference f 3 f }
780 T{ ##load-integer f 1 10 }
781 T{ ##load-integer f 2 20 }
782 T{ ##compare-integer f 3 1 2 cc= }
788 T{ ##load-integer f 1 1 }
789 T{ ##load-integer f 2 2 }
790 T{ ##load-reference f 3 t }
794 T{ ##load-integer f 1 1 }
795 T{ ##load-integer f 2 2 }
796 T{ ##compare-integer f 3 1 2 cc/= }
802 T{ ##load-integer f 1 1 }
803 T{ ##load-integer f 2 2 }
804 T{ ##load-reference f 3 t }
808 T{ ##load-integer f 1 1 }
809 T{ ##load-integer f 2 2 }
810 T{ ##compare-integer f 3 1 2 cc< }
816 T{ ##load-integer f 1 10 }
817 T{ ##load-integer f 2 20 }
818 T{ ##load-reference f 3 f }
822 T{ ##load-integer f 1 10 }
823 T{ ##load-integer f 2 20 }
824 T{ ##compare-integer f 3 2 1 cc< }
831 T{ ##load-reference f 1 f }
836 T{ ##compare-integer f 1 0 0 cc< }
843 T{ ##copy f 1 0 any-rep }
844 T{ ##load-reference f 2 f }
849 T{ ##copy f 1 0 any-rep }
850 T{ ##compare-integer f 2 0 1 cc< }
857 T{ ##load-reference f 1 t }
862 T{ ##compare-integer f 1 0 0 cc<= }
869 T{ ##load-reference f 1 f }
874 T{ ##compare-integer f 1 0 0 cc> }
881 T{ ##load-reference f 1 t }
886 T{ ##compare-integer f 1 0 0 cc>= }
893 T{ ##load-reference f 1 f }
898 T{ ##compare-integer f 1 0 0 cc/= }
905 T{ ##load-reference f 1 t }
910 T{ ##compare-integer f 1 0 0 cc= }
916 T{ ##load-integer f 1 10 }
917 T{ ##load-reference f 2 t }
921 T{ ##load-integer f 1 10 }
922 T{ ##compare-imm f 2 1 10 cc= }
928 T{ ##load-integer f 1 10 }
929 T{ ##load-reference f 2 f }
933 T{ ##load-integer f 1 10 }
934 T{ ##compare-imm f 2 1 20 cc= }
940 T{ ##load-integer f 1 10 }
941 T{ ##load-reference f 2 t }
945 T{ ##load-integer f 1 10 }
946 T{ ##compare-imm f 2 1 100 cc/= }
952 T{ ##load-integer f 1 10 }
953 T{ ##load-reference f 2 f }
957 T{ ##load-integer f 1 10 }
958 T{ ##compare-imm f 2 1 10 cc/= }
965 T{ ##load-reference f 1 + }
966 T{ ##load-reference f 2 f }
970 T{ ##load-reference f 1 + }
971 T{ ##compare-imm f 2 1 + cc/= }
977 T{ ##load-reference f 1 + }
978 T{ ##load-reference f 2 t }
982 T{ ##load-reference f 1 + }
983 T{ ##compare-imm f 2 1 * cc/= }
989 T{ ##load-reference f 1 + }
990 T{ ##load-reference f 2 t }
994 T{ ##load-reference f 1 + }
995 T{ ##compare-imm f 2 1 + cc= }
1001 T{ ##load-reference f 1 + }
1002 T{ ##load-reference f 2 f }
1006 T{ ##load-reference f 1 + }
1007 T{ ##compare-imm f 2 1 * cc= }
1015 T{ ##load-reference f 1 t }
1020 T{ ##compare f 1 0 0 cc= }
1027 T{ ##load-reference f 1 f }
1032 T{ ##compare f 1 0 0 cc/= }
1038 T{ ##load-integer f 1 12 }
1039 T{ ##load-reference f 3 t }
1043 T{ ##load-integer f 1 12 }
1044 T{ ##test-imm f 3 1 13 cc/= }
1050 T{ ##load-integer f 1 15 }
1051 T{ ##load-reference f 3 f }
1055 T{ ##load-integer f 1 15 }
1056 T{ ##test-imm f 3 1 16 cc/= }
1062 T{ ##load-integer f 1 12 }
1063 T{ ##load-reference f 3 f }
1067 T{ ##load-integer f 1 12 }
1068 T{ ##test-imm f 3 1 13 cc= }
1074 T{ ##load-integer f 1 15 }
1075 T{ ##load-reference f 3 t }
1079 T{ ##load-integer f 1 15 }
1080 T{ ##test-imm f 3 1 16 cc= }
1084 ! Rewriting a ##test of an ##and into a ##test
1090 T{ ##test f 3 0 1 cc= }
1097 T{ ##test f 3 2 2 cc= }
1104 T{ ##and-imm f 2 0 12 }
1105 T{ ##test-imm f 3 0 12 cc= }
1110 T{ ##and-imm f 2 0 12 }
1111 T{ ##test f 3 2 2 cc= }
1115 ! Rewriting ##test into ##test-imm
1119 T{ ##load-integer f 1 10 }
1120 T{ ##test-imm f 2 0 10 cc= }
1125 T{ ##load-integer f 1 10 }
1126 T{ ##test f 2 0 1 cc= }
1127 } value-number-bb trim-temps
1133 T{ ##load-integer f 1 10 }
1134 T{ ##test-imm f 2 0 10 cc= }
1139 T{ ##load-integer f 1 10 }
1140 T{ ##test f 2 1 0 cc= }
1141 } value-number-bb trim-temps
1147 T{ ##load-integer f 1 10 }
1148 T{ ##test-imm-branch f 0 10 cc= }
1153 T{ ##load-integer f 1 10 }
1154 T{ ##test-branch f 0 1 cc= }
1161 T{ ##load-integer f 1 10 }
1162 T{ ##test-imm-branch f 0 10 cc= }
1167 T{ ##load-integer f 1 10 }
1168 T{ ##test-branch f 1 0 cc= }
1175 T{ ##load-integer f 1 10 }
1176 T{ ##test-imm-branch f 0 10 cc= }
1181 T{ ##load-integer f 1 10 }
1182 T{ ##test-branch f 1 0 cc= }
1186 ! Make sure the immediate fits
1191 T{ ##load-integer f 1 100000000000 }
1192 T{ ##test f 2 1 0 cc= }
1197 T{ ##load-integer f 1 100000000000 }
1198 T{ ##test f 2 1 0 cc= }
1205 T{ ##load-integer f 1 100000000000 }
1206 T{ ##test-branch f 1 0 cc= }
1211 T{ ##load-integer f 1 100000000000 }
1212 T{ ##test-branch f 1 0 cc= }
1217 ! Rewriting ##compare into ##test
1222 T{ ##test f 1 0 0 cc= }
1227 T{ ##compare-integer-imm f 1 0 0 cc= }
1234 T{ ##test f 1 0 0 cc/= }
1239 T{ ##compare-integer-imm f 1 0 0 cc/= }
1246 T{ ##compare-integer-imm f 1 0 0 cc<= }
1251 T{ ##compare-integer-imm f 1 0 0 cc<= }
1258 T{ ##test-branch f 0 0 cc= }
1263 T{ ##compare-integer-imm-branch f 0 0 cc= }
1270 T{ ##test-branch f 0 0 cc/= }
1275 T{ ##compare-integer-imm-branch f 0 0 cc/= }
1282 T{ ##compare-integer-imm-branch f 0 0 cc<= }
1287 T{ ##compare-integer-imm-branch f 0 0 cc<= }
1296 T{ ##load-integer f 1 100 }
1297 T{ ##add-imm f 2 0 100 }
1298 T{ ##load-integer f 3 50 }
1299 T{ ##add-imm f 4 0 150 }
1304 T{ ##load-integer f 1 100 }
1306 T{ ##load-integer f 3 50 }
1314 T{ ##load-integer f 1 100 }
1315 T{ ##add-imm f 2 0 100 }
1316 T{ ##load-integer f 3 50 }
1317 T{ ##add-imm f 4 0 150 }
1322 T{ ##load-integer f 1 100 }
1324 T{ ##load-integer f 3 50 }
1332 T{ ##load-integer f 1 100 }
1333 T{ ##add-imm f 2 0 100 }
1334 T{ ##load-integer f 3 50 }
1335 T{ ##add-imm f 4 0 50 }
1340 T{ ##load-integer f 1 100 }
1342 T{ ##load-integer f 3 50 }
1350 T{ ##load-integer f 1 100 }
1351 T{ ##add-imm f 2 0 -100 }
1352 T{ ##load-integer f 3 50 }
1353 T{ ##add-imm f 4 0 -150 }
1358 T{ ##load-integer f 1 100 }
1360 T{ ##load-integer f 3 50 }
1368 T{ ##load-integer f 1 100 }
1369 T{ ##mul-imm f 2 0 100 }
1370 T{ ##load-integer f 3 50 }
1371 T{ ##mul-imm f 4 0 5000 }
1376 T{ ##load-integer f 1 100 }
1378 T{ ##load-integer f 3 50 }
1386 T{ ##load-integer f 1 100 }
1387 T{ ##mul-imm f 2 0 100 }
1388 T{ ##load-integer f 3 50 }
1389 T{ ##mul-imm f 4 0 5000 }
1394 T{ ##load-integer f 1 100 }
1396 T{ ##load-integer f 3 50 }
1404 T{ ##load-integer f 1 100 }
1405 T{ ##and-imm f 2 0 100 }
1406 T{ ##load-integer f 3 50 }
1407 T{ ##and-imm f 4 0 32 }
1412 T{ ##load-integer f 1 100 }
1414 T{ ##load-integer f 3 50 }
1422 T{ ##load-integer f 1 100 }
1423 T{ ##and-imm f 2 0 100 }
1424 T{ ##load-integer f 3 50 }
1425 T{ ##and-imm f 4 0 32 }
1430 T{ ##load-integer f 1 100 }
1432 T{ ##load-integer f 3 50 }
1440 T{ ##load-integer f 1 100 }
1441 T{ ##or-imm f 2 0 100 }
1442 T{ ##load-integer f 3 50 }
1443 T{ ##or-imm f 4 0 118 }
1448 T{ ##load-integer f 1 100 }
1450 T{ ##load-integer f 3 50 }
1458 T{ ##load-integer f 1 100 }
1459 T{ ##or-imm f 2 0 100 }
1460 T{ ##load-integer f 3 50 }
1461 T{ ##or-imm f 4 0 118 }
1466 T{ ##load-integer f 1 100 }
1468 T{ ##load-integer f 3 50 }
1476 T{ ##load-integer f 1 100 }
1477 T{ ##xor-imm f 2 0 100 }
1478 T{ ##load-integer f 3 50 }
1479 T{ ##xor-imm f 4 0 86 }
1484 T{ ##load-integer f 1 100 }
1486 T{ ##load-integer f 3 50 }
1494 T{ ##load-integer f 1 100 }
1495 T{ ##xor-imm f 2 0 100 }
1496 T{ ##load-integer f 3 50 }
1497 T{ ##xor-imm f 4 0 86 }
1502 T{ ##load-integer f 1 100 }
1504 T{ ##load-integer f 3 50 }
1512 T{ ##shl-imm f 1 0 10 }
1513 T{ ##shl-imm f 2 0 21 }
1514 T{ ##replace f 2 D 0 }
1519 T{ ##shl-imm f 1 0 10 }
1520 T{ ##shl-imm f 2 1 11 }
1521 T{ ##replace f 2 D 0 }
1528 T{ ##shl-imm f 1 0 10 }
1529 T{ ##shl-imm f 2 1 $[ cell-bits 1 - ] }
1530 T{ ##replace f 2 D 0 }
1535 T{ ##shl-imm f 1 0 10 }
1536 T{ ##shl-imm f 2 1 $[ cell-bits 1 - ] }
1537 T{ ##replace f 2 D 0 }
1544 T{ ##sar-imm f 1 0 10 }
1545 T{ ##sar-imm f 2 0 21 }
1546 T{ ##replace f 2 D 0 }
1551 T{ ##sar-imm f 1 0 10 }
1552 T{ ##sar-imm f 2 1 11 }
1553 T{ ##replace f 2 D 0 }
1560 T{ ##sar-imm f 1 0 10 }
1561 T{ ##sar-imm f 2 1 $[ cell-bits 1 - ] }
1562 T{ ##replace f 2 D 0 }
1567 T{ ##sar-imm f 1 0 10 }
1568 T{ ##sar-imm f 2 1 $[ cell-bits 1 - ] }
1569 T{ ##replace f 2 D 0 }
1576 T{ ##shr-imm f 1 0 10 }
1577 T{ ##shr-imm f 2 0 21 }
1578 T{ ##replace f 2 D 0 }
1583 T{ ##shr-imm f 1 0 10 }
1584 T{ ##shr-imm f 2 1 11 }
1585 T{ ##replace f 2 D 0 }
1592 T{ ##shr-imm f 1 0 10 }
1593 T{ ##shr-imm f 2 1 $[ cell-bits 1 - ] }
1594 T{ ##replace f 2 D 0 }
1599 T{ ##shr-imm f 1 0 10 }
1600 T{ ##shr-imm f 2 1 $[ cell-bits 1 - ] }
1601 T{ ##replace f 2 D 0 }
1608 T{ ##shr-imm f 1 0 10 }
1609 T{ ##sar-imm f 2 1 11 }
1610 T{ ##replace f 2 D 0 }
1615 T{ ##shr-imm f 1 0 10 }
1616 T{ ##sar-imm f 2 1 11 }
1617 T{ ##replace f 2 D 0 }
1622 2 \ vreg-counter set-global
1627 T{ ##add-imm f 1 0 10 }
1628 T{ ##shl-imm f 3 0 2 }
1629 T{ ##add-imm f 2 3 40 }
1630 T{ ##replace f 2 D 0 }
1635 T{ ##add-imm f 1 0 10 }
1636 T{ ##shl-imm f 2 1 2 }
1637 T{ ##replace f 2 D 0 }
1644 T{ ##add-imm f 1 0 10 }
1645 T{ ##mul-imm f 4 0 3 }
1646 T{ ##add-imm f 2 4 30 }
1647 T{ ##replace f 2 D 0 }
1652 T{ ##add-imm f 1 0 10 }
1653 T{ ##mul-imm f 2 1 3 }
1654 T{ ##replace f 2 D 0 }
1661 T{ ##add-imm f 1 0 -10 }
1662 T{ ##shl-imm f 5 0 2 }
1663 T{ ##add-imm f 2 5 -40 }
1664 T{ ##replace f 2 D 0 }
1669 T{ ##sub-imm f 1 0 10 }
1670 T{ ##shl-imm f 2 1 2 }
1671 T{ ##replace f 2 D 0 }
1678 T{ ##add-imm f 1 0 -10 }
1679 T{ ##mul-imm f 6 0 3 }
1680 T{ ##add-imm f 2 6 -30 }
1681 T{ ##replace f 2 D 0 }
1686 T{ ##sub-imm f 1 0 10 }
1687 T{ ##mul-imm f 2 1 3 }
1688 T{ ##replace f 2 D 0 }
1697 T{ ##copy f 3 0 any-rep }
1698 T{ ##replace f 0 D 0 }
1704 T{ ##add-imm f 3 0 0 }
1705 T{ ##replace f 3 D 0 }
1713 T{ ##copy f 3 0 any-rep }
1714 T{ ##replace f 0 D 0 }
1720 T{ ##or-imm f 3 0 0 }
1721 T{ ##replace f 3 D 0 }
1729 T{ ##copy f 3 0 any-rep }
1730 T{ ##replace f 0 D 0 }
1736 T{ ##xor-imm f 3 0 0 }
1737 T{ ##replace f 3 D 0 }
1744 T{ ##load-integer f 1 0 }
1749 T{ ##and-imm f 1 0 0 }
1756 T{ ##copy f 1 0 any-rep }
1757 T{ ##replace f 0 D 0 }
1762 T{ ##and-imm f 1 0 -1 }
1763 T{ ##replace f 1 D 0 }
1770 T{ ##copy f 1 0 any-rep }
1771 T{ ##replace f 0 D 0 }
1777 T{ ##replace f 1 D 0 }
1784 T{ ##copy f 1 0 any-rep }
1785 T{ ##replace f 0 D 0 }
1790 T{ ##or-imm f 1 0 0 }
1791 T{ ##replace f 1 D 0 }
1798 T{ ##load-integer f 1 -1 }
1803 T{ ##or-imm f 1 0 -1 }
1810 T{ ##copy f 1 0 any-rep }
1811 T{ ##replace f 0 D 0 }
1817 T{ ##replace f 1 D 0 }
1824 T{ ##copy f 1 0 any-rep }
1825 T{ ##replace f 0 D 0 }
1830 T{ ##xor-imm f 1 0 0 }
1831 T{ ##replace f 1 D 0 }
1839 T{ ##replace f 1 D 0 }
1844 T{ ##xor-imm f 1 0 -1 }
1845 T{ ##replace f 1 D 0 }
1852 T{ ##load-integer f 1 0 }
1864 T{ ##copy f 2 0 any-rep }
1865 T{ ##replace f 0 D 0 }
1870 T{ ##mul-imm f 2 0 1 }
1871 T{ ##replace f 2 D 0 }
1878 T{ ##copy f 2 0 any-rep }
1879 T{ ##replace f 0 D 0 }
1884 T{ ##shl-imm f 2 0 0 }
1885 T{ ##replace f 2 D 0 }
1892 T{ ##copy f 2 0 any-rep }
1893 T{ ##replace f 0 D 0 }
1898 T{ ##shr-imm f 2 0 0 }
1899 T{ ##replace f 2 D 0 }
1906 T{ ##copy f 2 0 any-rep }
1907 T{ ##replace f 0 D 0 }
1912 T{ ##sar-imm f 2 0 0 }
1913 T{ ##replace f 2 D 0 }
1921 T{ ##load-integer f 1 1 }
1922 T{ ##load-integer f 2 3 }
1923 T{ ##load-integer f 3 4 }
1928 T{ ##load-integer f 1 1 }
1929 T{ ##load-integer f 2 3 }
1937 T{ ##load-integer f 1 1 }
1938 T{ ##load-integer f 2 3 }
1939 T{ ##load-integer f 3 -2 }
1944 T{ ##load-integer f 1 1 }
1945 T{ ##load-integer f 2 3 }
1953 T{ ##load-integer f 1 2 }
1954 T{ ##load-integer f 2 3 }
1955 T{ ##load-integer f 3 6 }
1960 T{ ##load-integer f 1 2 }
1961 T{ ##load-integer f 2 3 }
1969 T{ ##load-integer f 1 2 }
1970 T{ ##load-integer f 2 1 }
1971 T{ ##load-integer f 3 0 }
1976 T{ ##load-integer f 1 2 }
1977 T{ ##load-integer f 2 1 }
1985 T{ ##load-integer f 1 2 }
1986 T{ ##load-integer f 2 1 }
1987 T{ ##load-integer f 3 3 }
1992 T{ ##load-integer f 1 2 }
1993 T{ ##load-integer f 2 1 }
2001 T{ ##load-integer f 1 2 }
2002 T{ ##load-integer f 2 3 }
2003 T{ ##load-integer f 3 1 }
2008 T{ ##load-integer f 1 2 }
2009 T{ ##load-integer f 2 3 }
2017 T{ ##load-integer f 1 1 }
2018 T{ ##load-integer f 3 8 }
2023 T{ ##load-integer f 1 1 }
2024 T{ ##shl-imm f 3 1 3 }
2032 T{ ##load-integer f 1 -1 }
2033 T{ ##load-integer f 3 0xffffffffffff }
2038 T{ ##load-integer f 1 -1 }
2039 T{ ##shr-imm f 3 1 16 }
2047 T{ ##load-integer f 1 -8 }
2048 T{ ##load-integer f 3 -4 }
2053 T{ ##load-integer f 1 -8 }
2054 T{ ##sar-imm f 3 1 1 }
2062 T{ ##load-integer f 1 65536 }
2063 T{ ##load-integer f 2 140737488355328 }
2069 T{ ##load-integer f 1 65536 }
2070 T{ ##shl-imm f 2 1 31 }
2078 T{ ##load-integer f 2 140737488355328 }
2084 T{ ##load-integer f 2 140737488355328 }
2089 ! PPC ADDI can't hold immediates this big.
2094 T{ ##load-integer f 2 2147483647 }
2095 T{ ##add-imm f 3 0 2147483647 }
2096 T{ ##add-imm f 4 3 2147483647 }
2101 T{ ##load-integer f 2 2147483647 }
2112 T{ ##load-integer f 1 1 }
2113 T{ ##load-integer f 2 -1 }
2118 T{ ##load-integer f 1 1 }
2126 T{ ##load-integer f 1 1 }
2127 T{ ##load-integer f 2 -2 }
2132 T{ ##load-integer f 1 1 }
2137 ! ##tagged>integer constant folding
2140 T{ ##load-reference f 1 f }
2141 T{ ##load-integer f 2 $[ \ f type-number ] }
2142 T{ ##copy f 3 2 any-rep }
2146 T{ ##load-reference f 1 f }
2147 T{ ##tagged>integer f 2 1 }
2148 T{ ##and-imm f 3 2 15 }
2154 T{ ##load-integer f 1 100 }
2155 T{ ##load-integer f 2 $[ 100 tag-fixnum ] }
2156 T{ ##load-integer f 3 $[ 100 tag-fixnum 1 + ] }
2160 T{ ##load-integer f 1 100 }
2161 T{ ##tagged>integer f 2 1 }
2162 T{ ##add-imm f 3 2 1 }
2166 ! Alien boxing and unboxing
2170 T{ ##box-alien f 1 0 }
2171 T{ ##copy f 2 0 any-rep }
2172 T{ ##replace f 0 D 0 }
2177 T{ ##box-alien f 1 0 }
2178 T{ ##unbox-alien f 2 1 }
2179 T{ ##replace f 2 D 0 }
2186 T{ ##box-alien f 1 0 }
2187 T{ ##copy f 2 0 any-rep }
2188 T{ ##replace f 0 D 0 }
2193 T{ ##box-alien f 1 0 }
2194 T{ ##unbox-any-c-ptr f 2 1 }
2195 T{ ##replace f 2 D 0 }
2202 T{ ##load-integer f 2 0 }
2203 T{ ##copy f 1 0 any-rep }
2204 T{ ##replace f 0 D 0 }
2209 T{ ##load-integer f 2 0 }
2210 T{ ##box-displaced-alien f 1 2 0 c-ptr }
2211 T{ ##replace f 1 D 0 }
2215 3 vreg-counter set-global
2220 T{ ##load-integer f 2 16 }
2221 T{ ##box-displaced-alien f 1 2 0 c-ptr }
2222 T{ ##unbox-any-c-ptr f 4 0 }
2223 T{ ##add-imm f 3 4 16 }
2228 T{ ##load-integer f 2 16 }
2229 T{ ##box-displaced-alien f 1 2 0 c-ptr }
2230 T{ ##unbox-any-c-ptr f 3 1 }
2234 4 vreg-counter set-global
2239 T{ ##box-alien f 0 1 }
2240 T{ ##load-integer f 2 16 }
2241 T{ ##box-displaced-alien f 3 2 0 c-ptr }
2242 T{ ##copy f 5 1 any-rep }
2243 T{ ##add-imm f 4 5 16 }
2248 T{ ##box-alien f 0 1 }
2249 T{ ##load-integer f 2 16 }
2250 T{ ##box-displaced-alien f 3 2 0 c-ptr }
2251 T{ ##unbox-any-c-ptr f 4 3 }
2255 3 vreg-counter set-global
2260 T{ ##load-integer f 2 0 }
2261 T{ ##copy f 3 0 any-rep }
2262 T{ ##replace f 0 D 1 }
2267 T{ ##load-integer f 2 0 }
2268 T{ ##box-displaced-alien f 3 2 0 c-ptr }
2269 T{ ##replace f 3 D 1 }
2273 ! Various SIMD simplifications
2277 T{ ##vector>scalar f 1 0 float-4-rep }
2278 T{ ##copy f 2 0 any-rep }
2283 T{ ##vector>scalar f 1 0 float-4-rep }
2284 T{ ##scalar>vector f 2 1 float-4-rep }
2290 T{ ##copy f 1 0 any-rep }
2294 T{ ##shuffle-vector-imm f 1 0 { 0 1 2 3 } float-4-rep }
2301 T{ ##shuffle-vector-imm f 1 0 { 1 2 3 0 } float-4-rep }
2302 T{ ##shuffle-vector-imm f 2 0 { 0 2 3 1 } float-4-rep }
2307 T{ ##shuffle-vector-imm f 1 0 { 1 2 3 0 } float-4-rep }
2308 T{ ##shuffle-vector-imm f 2 1 { 3 1 2 0 } float-4-rep }
2314 T{ ##shuffle-vector-imm f 1 0 { 1 2 3 0 } float-4-rep }
2315 T{ ##shuffle-vector-imm f 2 1 { 1 0 } double-2-rep }
2319 T{ ##shuffle-vector-imm f 1 0 { 1 2 3 0 } float-4-rep }
2320 T{ ##shuffle-vector-imm f 2 1 { 1 0 } double-2-rep }
2326 T{ ##load-integer f 0 55 }
2327 T{ ##load-reference f 1 B{ 55 0 0 0 55 0 0 0 55 0 0 0 55 0 0 0 } }
2328 T{ ##load-reference f 2 B{ 55 0 0 0 55 0 0 0 55 0 0 0 55 0 0 0 } }
2332 T{ ##load-integer f 0 55 }
2333 T{ ##scalar>vector f 1 0 int-4-rep }
2334 T{ ##shuffle-vector-imm f 2 1 { 0 0 0 0 } float-4-rep }
2340 T{ ##load-reference f 0 1.25 }
2341 T{ ##load-reference f 1 B{ 0 0 160 63 0 0 160 63 0 0 160 63 0 0 160 63 } }
2342 T{ ##load-reference f 2 B{ 0 0 160 63 0 0 160 63 0 0 160 63 0 0 160 63 } }
2346 T{ ##load-reference f 0 1.25 }
2347 T{ ##scalar>vector f 1 0 float-4-rep }
2348 T{ ##shuffle-vector-imm f 2 1 { 0 0 0 0 } float-4-rep }
2354 T{ ##load-reference f 0 1.25 }
2355 T{ ##load-reference f 1 B{ 0 0 160 63 0 0 160 63 0 0 160 63 0 0 160 63 } }
2356 T{ ##load-reference f 2 B{ 0 0 160 63 0 0 160 63 0 0 160 63 0 0 160 63 } }
2360 T{ ##load-reference f 0 1.25 }
2361 T{ ##scalar>vector f 1 0 float-4-rep }
2362 T{ ##shuffle-vector-imm f 2 1 { 0 0 0 0 } float-4-rep }
2368 T{ ##load-integer f 0 55 }
2369 T{ ##load-reference f 1 B{ 55 0 55 0 55 0 55 0 55 0 55 0 55 0 55 0 } }
2370 T{ ##load-reference f 2 B{ 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 } }
2371 T{ ##load-reference f 3 B{ 0 55 0 55 0 55 0 55 0 55 0 55 0 55 0 55 } }
2375 T{ ##load-integer f 0 55 }
2376 T{ ##scalar>vector f 1 0 short-8-rep }
2377 T{ ##load-reference f 2 B{ 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 } }
2378 T{ ##shuffle-vector f 3 1 2 float-4-rep }
2384 T{ ##load-reference f 0 1.25 }
2385 T{ ##load-reference f 2 3.75 }
2386 T{ ##load-reference f 4 B{ 0 0 0 0 0 0 244 63 0 0 0 0 0 0 14 64 } }
2390 T{ ##load-reference f 0 1.25 }
2391 T{ ##load-reference f 2 3.75 }
2392 T{ ##gather-vector-2 f 4 0 2 double-2-rep }
2398 T{ ##load-integer f 0 125 }
2399 T{ ##load-integer f 2 375 }
2400 T{ ##load-reference f 4 B{ 125 0 0 0 0 0 0 0 119 1 0 0 0 0 0 0 } }
2404 T{ ##load-integer f 0 125 }
2405 T{ ##load-integer f 2 375 }
2406 T{ ##gather-vector-2 f 4 0 2 longlong-2-rep }
2412 T{ ##load-reference f 0 1.25 }
2413 T{ ##load-reference f 1 2.50 }
2414 T{ ##load-reference f 2 3.75 }
2415 T{ ##load-reference f 3 5.00 }
2416 T{ ##load-reference f 4 B{ 0 0 160 63 0 0 32 64 0 0 112 64 0 0 160 64 } }
2420 T{ ##load-reference f 0 1.25 }
2421 T{ ##load-reference f 1 2.50 }
2422 T{ ##load-reference f 2 3.75 }
2423 T{ ##load-reference f 3 5.00 }
2424 T{ ##gather-vector-4 f 4 0 1 2 3 float-4-rep }
2430 T{ ##load-integer f 0 125 }
2431 T{ ##load-integer f 1 250 }
2432 T{ ##load-integer f 2 375 }
2433 T{ ##load-integer f 3 500 }
2434 T{ ##load-reference f 4 B{ 125 0 0 0 250 0 0 0 119 1 0 0 244 1 0 0 } }
2438 T{ ##load-integer f 0 125 }
2439 T{ ##load-integer f 1 250 }
2440 T{ ##load-integer f 2 375 }
2441 T{ ##load-integer f 3 500 }
2442 T{ ##gather-vector-4 f 4 0 1 2 3 int-4-rep }
2448 T{ ##zero-vector f 2 float-4-rep }
2452 T{ ##xor-vector f 2 1 1 float-4-rep }
2456 ! NOT x AND y => x ANDN y
2462 T{ ##fill-vector f 3 float-4-rep }
2463 T{ ##xor-vector f 4 0 3 float-4-rep }
2464 T{ ##andn-vector f 5 0 1 float-4-rep }
2470 T{ ##fill-vector f 3 float-4-rep }
2471 T{ ##xor-vector f 4 0 3 float-4-rep }
2472 T{ ##and-vector f 5 4 1 float-4-rep }
2480 T{ ##not-vector f 4 0 float-4-rep }
2481 T{ ##andn-vector f 5 0 1 float-4-rep }
2487 T{ ##not-vector f 4 0 float-4-rep }
2488 T{ ##and-vector f 5 4 1 float-4-rep }
2492 ! x AND NOT y => y ANDN x
2498 T{ ##fill-vector f 3 float-4-rep }
2499 T{ ##xor-vector f 4 0 3 float-4-rep }
2500 T{ ##andn-vector f 5 0 1 float-4-rep }
2506 T{ ##fill-vector f 3 float-4-rep }
2507 T{ ##xor-vector f 4 0 3 float-4-rep }
2508 T{ ##and-vector f 5 1 4 float-4-rep }
2516 T{ ##not-vector f 4 0 float-4-rep }
2517 T{ ##andn-vector f 5 0 1 float-4-rep }
2523 T{ ##not-vector f 4 0 float-4-rep }
2524 T{ ##and-vector f 5 1 4 float-4-rep }
2528 ! NOT x ANDN y => x AND y
2534 T{ ##fill-vector f 3 float-4-rep }
2535 T{ ##xor-vector f 4 0 3 float-4-rep }
2536 T{ ##and-vector f 5 0 1 float-4-rep }
2542 T{ ##fill-vector f 3 float-4-rep }
2543 T{ ##xor-vector f 4 0 3 float-4-rep }
2544 T{ ##andn-vector f 5 4 1 float-4-rep }
2552 T{ ##not-vector f 4 0 float-4-rep }
2553 T{ ##and-vector f 5 0 1 float-4-rep }
2559 T{ ##not-vector f 4 0 float-4-rep }
2560 T{ ##andn-vector f 5 4 1 float-4-rep }
2571 T{ ##fill-vector f 3 float-4-rep }
2572 T{ ##xor-vector f 4 0 3 float-4-rep }
2573 T{ ##andn-vector f 5 0 1 float-4-rep }
2574 T{ ##and-vector f 6 0 2 float-4-rep }
2575 T{ ##or-vector f 7 5 6 float-4-rep }
2582 T{ ##fill-vector f 3 float-4-rep }
2583 T{ ##xor-vector f 4 0 3 float-4-rep }
2584 T{ ##and-vector f 5 4 1 float-4-rep }
2585 T{ ##andn-vector f 6 4 2 float-4-rep }
2586 T{ ##or-vector f 7 5 6 float-4-rep }
2595 T{ ##not-vector f 4 0 float-4-rep }
2596 T{ ##andn-vector f 5 0 1 float-4-rep }
2597 T{ ##and-vector f 6 0 2 float-4-rep }
2598 T{ ##or-vector f 7 5 6 float-4-rep }
2605 T{ ##not-vector f 4 0 float-4-rep }
2606 T{ ##and-vector f 5 4 1 float-4-rep }
2607 T{ ##andn-vector f 6 4 2 float-4-rep }
2608 T{ ##or-vector f 7 5 6 float-4-rep }
2613 : test-branch-folding ( insns -- insns' n )
2620 0 get [ instructions>> ] [ successors>> first number>> 1 - ] bi ;
2624 T{ ##load-integer f 1 1 }
2625 T{ ##load-integer f 2 2 }
2631 T{ ##load-integer f 1 1 }
2632 T{ ##load-integer f 2 2 }
2633 T{ ##compare-branch f 1 2 cc= }
2634 } test-branch-folding
2639 T{ ##load-integer f 1 1 }
2640 T{ ##load-integer f 2 2 }
2646 T{ ##load-integer f 1 1 }
2647 T{ ##load-integer f 2 2 }
2648 T{ ##compare-branch f 1 2 cc/= }
2649 } test-branch-folding
2654 T{ ##load-integer f 1 1 }
2655 T{ ##load-integer f 2 2 }
2661 T{ ##load-integer f 1 1 }
2662 T{ ##load-integer f 2 2 }
2663 T{ ##compare-integer-branch f 1 2 cc< }
2664 } test-branch-folding
2669 T{ ##load-integer f 1 1 }
2670 T{ ##load-integer f 2 2 }
2676 T{ ##load-integer f 1 1 }
2677 T{ ##load-integer f 2 2 }
2678 T{ ##compare-integer-branch f 2 1 cc< }
2679 } test-branch-folding
2691 T{ ##compare-integer-branch f 0 0 cc< }
2692 } test-branch-folding
2704 T{ ##compare-integer-branch f 0 0 cc<= }
2705 } test-branch-folding
2717 T{ ##compare-integer-branch f 0 0 cc> }
2718 } test-branch-folding
2730 T{ ##compare-integer-branch f 0 0 cc>= }
2731 } test-branch-folding
2743 T{ ##compare-integer-branch f 0 0 cc= }
2744 } test-branch-folding
2756 T{ ##compare-integer-branch f 0 0 cc/= }
2757 } test-branch-folding
2763 T{ ##load-reference f 1 t }
2770 T{ ##compare f 1 0 0 cc<= }
2771 T{ ##compare-imm-branch f 1 f cc/= }
2772 } test-branch-folding
2775 ! More branch folding tests
2776 V{ T{ ##branch } } 0 test-bb
2780 T{ ##compare-integer-branch f 0 0 cc< }
2784 T{ ##load-integer f 1 1 }
2789 T{ ##load-integer f 2 2 }
2794 T{ ##phi f 3 H{ { 2 1 } { 3 2 } } }
2795 T{ ##replace f 3 D 0 }
2805 [ select-representations ]
2810 { 1 } [ 1 get successors>> length ] unit-test
2812 { t } [ 1 get successors>> first 3 get eq? ] unit-test
2814 { 2 } [ 4 get instructions>> length ] unit-test
2823 T{ ##compare-integer-branch f 1 1 cc< }
2827 T{ ##copy f 2 0 any-rep }
2832 T{ ##phi f 3 H{ { 1 1 } { 2 0 } } }
2837 T{ ##replace f 3 D 0 }
2843 { } [ 0 get block>cfg value-numbering ] unit-test
2845 { t } [ 1 get successors>> first 3 get eq? ] unit-test
2847 { t } [ 3 get instructions>> first ##copy? ] unit-test
2849 V{ T{ ##prologue } T{ ##branch } } 0 test-bb
2852 T{ ##peek { dst 15 } { loc D 0 } }
2853 T{ ##copy { dst 16 } { src 15 } { rep any-rep } }
2854 T{ ##copy { dst 17 } { src 15 } { rep any-rep } }
2855 T{ ##copy { dst 18 } { src 15 } { rep any-rep } }
2856 T{ ##copy { dst 19 } { src 15 } { rep any-rep } }
2864 T{ ##copy { dst 21 } { src 20 } { rep any-rep } }
2865 T{ ##compare-imm-branch
2873 T{ ##copy { dst 23 } { src 15 } { rep any-rep } }
2874 T{ ##copy { dst 24 } { src 15 } { rep any-rep } }
2875 T{ ##load-reference { dst 25 } { obj t } }
2880 T{ ##replace { src 25 } { loc D 0 } }
2886 T{ ##copy { dst 26 } { src 15 } { rep any-rep } }
2887 T{ ##copy { dst 27 } { src 15 } { rep any-rep } }
2897 T{ ##replace { src 28 } { loc D 0 } }
2909 dup value-numbering eliminate-dead-code
2912 { f } [ 1 get instructions>> [ ##peek? ] any? ] unit-test
2914 ! Slot addressing optimization
2920 T{ ##add-imm f 2 1 2 }
2921 T{ ##slot f 3 0 1 $[ cell log2 ] $[ 7 2 cells - ] }
2927 T{ ##add-imm f 2 1 2 }
2928 T{ ##slot f 3 0 2 $[ cell log2 ] 7 }
2933 ! Alien addressing optimization
2935 ! Base offset fusion on ##load/store-memory-imm
2939 T{ ##tagged>integer f 2 1 }
2940 T{ ##add-imm f 3 2 10 }
2941 T{ ##load-memory-imm f 4 2 10 int-rep c:uchar }
2946 T{ ##tagged>integer f 2 1 }
2947 T{ ##add-imm f 3 2 10 }
2948 T{ ##load-memory-imm f 4 3 0 int-rep c:uchar }
2956 T{ ##tagged>integer f 2 0 }
2957 T{ ##tagged>integer f 3 1 }
2958 T{ ##add-imm f 4 3 10 }
2959 T{ ##store-memory-imm f 2 3 10 int-rep c:uchar }
2965 T{ ##tagged>integer f 2 0 }
2966 T{ ##tagged>integer f 3 1 }
2967 T{ ##add-imm f 4 3 10 }
2968 T{ ##store-memory-imm f 2 4 0 int-rep c:uchar }
2972 ! Displacement fusion on ##load/store-memory-imm
2977 T{ ##tagged>integer f 2 0 }
2978 T{ ##tagged>integer f 3 1 }
2980 T{ ##load-memory f 5 2 3 0 0 int-rep c:uchar }
2986 T{ ##tagged>integer f 2 0 }
2987 T{ ##tagged>integer f 3 1 }
2989 T{ ##load-memory-imm f 5 4 0 int-rep c:uchar }
2997 T{ ##tagged>integer f 2 0 }
2998 T{ ##tagged>integer f 3 1 }
3000 T{ ##store-memory f 5 2 3 0 0 int-rep c:uchar }
3006 T{ ##tagged>integer f 2 0 }
3007 T{ ##tagged>integer f 3 1 }
3009 T{ ##store-memory-imm f 5 4 0 int-rep c:uchar }
3013 ! Base offset fusion on ##load/store-memory -- only on x86
3019 T{ ##tagged>integer f 2 0 }
3020 T{ ##tagged>integer f 3 1 }
3021 T{ ##add-imm f 4 2 31337 }
3022 T{ ##load-memory f 5 2 3 0 31337 int-rep c:uchar }
3029 T{ ##tagged>integer f 2 0 }
3030 T{ ##tagged>integer f 3 1 }
3031 T{ ##add-imm f 4 2 31337 }
3032 T{ ##load-memory f 5 4 3 0 0 int-rep c:uchar }
3039 T{ ##tagged>integer f 2 0 }
3040 T{ ##tagged>integer f 3 1 }
3041 T{ ##add-imm f 4 2 31337 }
3042 T{ ##load-memory f 5 4 3 0 0 int-rep c:uchar }
3046 ! Displacement offset fusion on ##load/store-memory -- only on x86
3052 T{ ##tagged>integer f 2 0 }
3053 T{ ##tagged>integer f 3 1 }
3054 T{ ##add-imm f 4 3 31337 }
3055 T{ ##load-memory f 5 2 3 0 31338 int-rep c:uchar }
3062 T{ ##tagged>integer f 2 0 }
3063 T{ ##tagged>integer f 3 1 }
3064 T{ ##add-imm f 4 3 31337 }
3065 T{ ##load-memory f 5 2 4 0 1 int-rep c:uchar }
3072 T{ ##tagged>integer f 2 0 }
3073 T{ ##tagged>integer f 3 1 }
3074 T{ ##add-imm f 4 3 31337 }
3075 T{ ##load-memory f 5 2 4 0 1 int-rep c:uchar }
3079 ! Displacement offset fusion should not occur on
3080 ! ##load/store-memory with non-zero scale
3085 T{ ##tagged>integer f 2 0 }
3086 T{ ##tagged>integer f 3 1 }
3087 T{ ##add-imm f 4 3 10 }
3088 T{ ##load-memory f 5 2 4 1 1 int-rep c:uchar }
3089 } dup value-number-bb assert=
3092 ! Scale fusion on ##load/store-memory
3098 T{ ##tagged>integer f 2 0 }
3099 T{ ##tagged>integer f 3 1 }
3100 T{ ##shl-imm f 4 3 2 }
3101 T{ ##load-memory f 5 2 3 2 0 int-rep c:uchar }
3108 T{ ##tagged>integer f 2 0 }
3109 T{ ##tagged>integer f 3 1 }
3110 T{ ##shl-imm f 4 3 2 }
3111 T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
3118 T{ ##tagged>integer f 2 0 }
3119 T{ ##tagged>integer f 3 1 }
3120 T{ ##shl-imm f 4 3 2 }
3121 T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
3126 ! Don't do scale fusion if there's already a scale
3131 T{ ##tagged>integer f 2 0 }
3132 T{ ##tagged>integer f 3 1 }
3133 T{ ##shl-imm f 4 3 2 }
3134 T{ ##load-memory f 5 2 4 1 0 int-rep c:uchar }
3135 } dup value-number-bb assert=
3138 ! Don't do scale fusion if the scale factor is out of range
3143 T{ ##tagged>integer f 2 0 }
3144 T{ ##tagged>integer f 3 1 }
3145 T{ ##shl-imm f 4 3 4 }
3146 T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
3147 } dup value-number-bb assert=
3151 ! Make sure to search for available registers that compute the
3152 ! same value number, instead of just relying on the
3153 ! availability of the canonical leader.
3155 V{ T{ ##branch } } 0 test-bb
3158 T{ ##inc { loc D -1 } }
3159 T{ ##peek { dst 1 } { loc D -1 } }
3160 T{ ##compare-imm-branch { src1 1 } { src2 f } { cc cc/= } }
3164 T{ ##inc { loc D 1 } }
3165 T{ ##load-integer { dst 2 } { val 100 } }
3170 T{ ##inc { loc D 1 } }
3171 T{ ##load-integer { dst 3 } { val 200 } }
3176 T{ ##load-integer { dst 4 } { val 100 } }
3177 T{ ##load-integer { dst 5 } { val 100 } }
3178 T{ ##load-integer { dst 6 } { val 100 } }
3183 { } [ 0 get block>cfg value-numbering ] unit-test
3185 ! First ##load-integer cannot be turned into a ##copy because
3186 ! the canonical leader for the value 100 is unavailable, but
3187 ! the rest should still be redundant.
3188 { t } [ 4 get instructions>> first ##load-integer? ] unit-test
3189 { 1 } [ 4 get instructions>> [ ##load-integer? ] count ] unit-test
3191 ! Global optimization
3192 V{ T{ ##prologue } T{ ##branch } } 0 test-bb
3196 T{ ##load-integer f 21 0 }
3197 T{ ##load-integer f 22 100 }
3198 T{ ##load-integer f 23 0 }
3199 T{ ##copy f 24 22 any-rep }
3200 T{ ##copy f 25 21 any-rep }
3201 T{ ##copy f 26 24 any-rep }
3202 T{ ##copy f 27 23 any-rep }
3206 ! Need to define bb 3 before the ##phi in bb 2 can be resolved
3208 T{ ##load-integer f 35 1 }
3209 T{ ##add f 36 29 35 }
3210 T{ ##load-integer f 37 1 }
3211 T{ ##add f 38 30 37 }
3212 T{ ##copy f 39 30 any-rep }
3213 T{ ##copy f 40 26 any-rep }
3214 T{ ##copy f 41 36 any-rep }
3215 T{ ##copy f 42 38 any-rep }
3220 T{ ##phi f 29 H{ { 1 25 } { 3 41 } } }
3221 T{ ##phi f 30 H{ { 1 27 } { 3 42 } } }
3222 T{ ##compare-integer f 31 30 26 cc< 9 }
3223 T{ ##copy f 32 31 any-rep }
3224 T{ ##copy f 33 26 any-rep }
3225 T{ ##copy f 34 31 any-rep }
3226 T{ ##compare-imm-branch f 32 f cc/= }
3231 T{ ##replace f 29 D 0 }
3235 V{ T{ ##epilogue } T{ ##return } } 5 test-bb
3243 { } [ 0 get block>cfg dup value-numbering eliminate-dead-code ] unit-test
3245 { 1 } [ 1 get instructions>> [ ##load-integer? ] count ] unit-test
3246 { 1 } [ 2 get instructions>> [ ##phi? ] count ] unit-test
3247 { t } [ 2 get instructions>> last ##compare-integer-imm-branch? ] unit-test
3248 { f } [ 3 get instructions>> [ ##load-integer? ] any? ] unit-test
3249 { 1 } [ 3 get instructions>> [ ##add-imm? ] count ] unit-test