1 USING: compiler.cfg.value-numbering compiler.cfg.instructions
2 compiler.cfg.registers compiler.cfg.debugger compiler.cfg.comparisons
3 cpu.architecture tools.test kernel math combinators.short-circuit
4 accessors sequences compiler.cfg.predecessors locals compiler.cfg.dce
5 compiler.cfg.ssa.destruction compiler.cfg.loop-detection
6 compiler.cfg.representations compiler.cfg assocs vectors arrays
7 layouts namespaces alien ;
8 IN: compiler.cfg.value-numbering.tests
10 : trim-temps ( insns -- insns )
15 [ ##compare-float-unordered? ]
16 [ ##compare-float-ordered? ]
17 } 1|| [ f >>temp ] when
20 ! Folding constants together
23 T{ ##load-reference f 0 0.0 }
24 T{ ##load-reference f 1 -0.0 }
25 T{ ##replace f 0 D 0 }
26 T{ ##replace f 1 D 1 }
30 T{ ##load-reference f 0 0.0 }
31 T{ ##load-reference f 1 -0.0 }
32 T{ ##replace f 0 D 0 }
33 T{ ##replace f 1 D 1 }
34 } value-numbering-step
39 T{ ##load-reference f 0 0.0 }
40 T{ ##copy f 1 0 any-rep }
41 T{ ##replace f 0 D 0 }
42 T{ ##replace f 1 D 1 }
46 T{ ##load-reference f 0 0.0 }
47 T{ ##load-reference f 1 0.0 }
48 T{ ##replace f 0 D 0 }
49 T{ ##replace f 1 D 1 }
50 } value-numbering-step
55 T{ ##load-reference f 0 t }
56 T{ ##copy f 1 0 any-rep }
57 T{ ##replace f 0 D 0 }
58 T{ ##replace f 1 D 1 }
62 T{ ##load-reference f 0 t }
63 T{ ##load-reference f 1 t }
64 T{ ##replace f 0 D 0 }
65 T{ ##replace f 1 D 1 }
66 } value-numbering-step
72 T{ ##load-reference f 1 + }
74 T{ ##compare f 4 2 1 cc> }
75 T{ ##copy f 6 4 any-rep }
76 T{ ##replace f 6 D 0 }
80 T{ ##load-reference f 1 + }
82 T{ ##compare f 4 2 1 cc> }
83 T{ ##compare-imm f 6 4 5 cc/= }
84 T{ ##replace f 6 D 0 }
85 } value-numbering-step trim-temps
90 T{ ##load-reference f 1 + }
92 T{ ##compare f 4 2 1 cc<= }
93 T{ ##compare f 6 2 1 cc/<= }
94 T{ ##replace f 6 D 0 }
98 T{ ##load-reference f 1 + }
100 T{ ##compare f 4 2 1 cc<= }
101 T{ ##compare-imm f 6 4 5 cc= }
102 T{ ##replace f 6 D 0 }
103 } value-numbering-step trim-temps
110 T{ ##unbox-float f 10 8 }
111 T{ ##unbox-float f 11 9 }
112 T{ ##compare-float-unordered f 12 10 11 cc< }
113 T{ ##compare-float-unordered f 14 10 11 cc/< }
114 T{ ##replace f 14 D 0 }
120 T{ ##unbox-float f 10 8 }
121 T{ ##unbox-float f 11 9 }
122 T{ ##compare-float-unordered f 12 10 11 cc< }
123 T{ ##compare-imm f 14 12 5 cc= }
124 T{ ##replace f 14 D 0 }
125 } value-numbering-step trim-temps
130 T{ ##peek f 29 D -1 }
131 T{ ##peek f 30 D -2 }
132 T{ ##compare f 33 29 30 cc<= }
133 T{ ##compare-branch f 29 30 cc<= }
137 T{ ##peek f 29 D -1 }
138 T{ ##peek f 30 D -2 }
139 T{ ##compare f 33 29 30 cc<= }
140 T{ ##compare-imm-branch f 33 5 cc/= }
141 } value-numbering-step trim-temps
144 ! Immediate operand conversion
148 T{ ##load-immediate f 1 100 }
149 T{ ##add-imm f 2 0 100 }
154 T{ ##load-immediate f 1 100 }
156 } value-numbering-step
162 T{ ##load-immediate f 1 100 }
163 T{ ##add-imm f 2 0 100 }
168 T{ ##load-immediate f 1 100 }
170 } value-numbering-step
176 T{ ##load-immediate f 1 100 }
177 T{ ##add-imm f 2 0 -100 }
182 T{ ##load-immediate f 1 100 }
184 } value-numbering-step
190 T{ ##load-immediate f 1 0 }
196 } value-numbering-step
202 T{ ##load-immediate f 1 100 }
203 T{ ##mul-imm f 2 0 100 }
208 T{ ##load-immediate f 1 100 }
210 } value-numbering-step
216 T{ ##load-immediate f 1 100 }
217 T{ ##mul-imm f 2 0 100 }
222 T{ ##load-immediate f 1 100 }
224 } value-numbering-step
230 T{ ##shl-imm f 2 1 3 }
235 T{ ##mul-imm f 2 1 8 }
236 } value-numbering-step
242 T{ ##load-immediate f 1 100 }
243 T{ ##and-imm f 2 0 100 }
248 T{ ##load-immediate f 1 100 }
250 } value-numbering-step
256 T{ ##load-immediate f 1 100 }
257 T{ ##and-imm f 2 0 100 }
262 T{ ##load-immediate f 1 100 }
264 } value-numbering-step
270 T{ ##load-immediate f 1 100 }
271 T{ ##or-imm f 2 0 100 }
276 T{ ##load-immediate f 1 100 }
278 } value-numbering-step
284 T{ ##load-immediate f 1 100 }
285 T{ ##or-imm f 2 0 100 }
290 T{ ##load-immediate f 1 100 }
292 } value-numbering-step
298 T{ ##load-immediate f 1 100 }
299 T{ ##xor-imm f 2 0 100 }
304 T{ ##load-immediate f 1 100 }
306 } value-numbering-step
312 T{ ##load-immediate f 1 100 }
313 T{ ##xor-imm f 2 0 100 }
318 T{ ##load-immediate f 1 100 }
320 } value-numbering-step
326 T{ ##load-immediate f 1 100 }
327 T{ ##compare-imm f 2 0 100 cc<= }
332 T{ ##load-immediate f 1 100 }
333 T{ ##compare f 2 0 1 cc<= }
334 } value-numbering-step trim-temps
340 T{ ##load-immediate f 1 100 }
341 T{ ##compare-imm f 2 0 100 cc>= }
346 T{ ##load-immediate f 1 100 }
347 T{ ##compare f 2 1 0 cc<= }
348 } value-numbering-step trim-temps
354 T{ ##load-immediate f 1 100 }
355 T{ ##compare-imm-branch f 0 100 cc<= }
360 T{ ##load-immediate f 1 100 }
361 T{ ##compare-branch f 0 1 cc<= }
362 } value-numbering-step
368 T{ ##load-immediate f 1 100 }
369 T{ ##compare-imm-branch f 0 100 cc>= }
374 T{ ##load-immediate f 1 100 }
375 T{ ##compare-branch f 1 0 cc<= }
376 } value-numbering-step trim-temps
383 T{ ##load-immediate f 1 100 }
384 T{ ##add-imm f 2 0 100 }
385 T{ ##load-immediate f 3 50 }
386 T{ ##add-imm f 4 0 150 }
391 T{ ##load-immediate f 1 100 }
393 T{ ##load-immediate f 3 50 }
395 } value-numbering-step
401 T{ ##load-immediate f 1 100 }
402 T{ ##add-imm f 2 0 100 }
403 T{ ##load-immediate f 3 50 }
404 T{ ##add-imm f 4 0 150 }
409 T{ ##load-immediate f 1 100 }
411 T{ ##load-immediate f 3 50 }
413 } value-numbering-step
419 T{ ##load-immediate f 1 100 }
420 T{ ##add-imm f 2 0 100 }
421 T{ ##load-immediate f 3 50 }
422 T{ ##add-imm f 4 0 50 }
427 T{ ##load-immediate f 1 100 }
429 T{ ##load-immediate f 3 50 }
431 } value-numbering-step
437 T{ ##load-immediate f 1 100 }
438 T{ ##add-imm f 2 0 -100 }
439 T{ ##load-immediate f 3 50 }
440 T{ ##add-imm f 4 0 -150 }
445 T{ ##load-immediate f 1 100 }
447 T{ ##load-immediate f 3 50 }
449 } value-numbering-step
455 T{ ##load-immediate f 1 100 }
456 T{ ##mul-imm f 2 0 100 }
457 T{ ##load-immediate f 3 50 }
458 T{ ##mul-imm f 4 0 5000 }
463 T{ ##load-immediate f 1 100 }
465 T{ ##load-immediate f 3 50 }
467 } value-numbering-step
473 T{ ##load-immediate f 1 100 }
474 T{ ##mul-imm f 2 0 100 }
475 T{ ##load-immediate f 3 50 }
476 T{ ##mul-imm f 4 0 5000 }
481 T{ ##load-immediate f 1 100 }
483 T{ ##load-immediate f 3 50 }
485 } value-numbering-step
491 T{ ##load-immediate f 1 100 }
492 T{ ##and-imm f 2 0 100 }
493 T{ ##load-immediate f 3 50 }
494 T{ ##and-imm f 4 0 32 }
499 T{ ##load-immediate f 1 100 }
501 T{ ##load-immediate f 3 50 }
503 } value-numbering-step
509 T{ ##load-immediate f 1 100 }
510 T{ ##and-imm f 2 0 100 }
511 T{ ##load-immediate f 3 50 }
512 T{ ##and-imm f 4 0 32 }
517 T{ ##load-immediate f 1 100 }
519 T{ ##load-immediate f 3 50 }
521 } value-numbering-step
527 T{ ##load-immediate f 1 100 }
528 T{ ##or-imm f 2 0 100 }
529 T{ ##load-immediate f 3 50 }
530 T{ ##or-imm f 4 0 118 }
535 T{ ##load-immediate f 1 100 }
537 T{ ##load-immediate f 3 50 }
539 } value-numbering-step
545 T{ ##load-immediate f 1 100 }
546 T{ ##or-imm f 2 0 100 }
547 T{ ##load-immediate f 3 50 }
548 T{ ##or-imm f 4 0 118 }
553 T{ ##load-immediate f 1 100 }
555 T{ ##load-immediate f 3 50 }
557 } value-numbering-step
563 T{ ##load-immediate f 1 100 }
564 T{ ##xor-imm f 2 0 100 }
565 T{ ##load-immediate f 3 50 }
566 T{ ##xor-imm f 4 0 86 }
571 T{ ##load-immediate f 1 100 }
573 T{ ##load-immediate f 3 50 }
575 } value-numbering-step
581 T{ ##load-immediate f 1 100 }
582 T{ ##xor-imm f 2 0 100 }
583 T{ ##load-immediate f 3 50 }
584 T{ ##xor-imm f 4 0 86 }
589 T{ ##load-immediate f 1 100 }
591 T{ ##load-immediate f 3 50 }
593 } value-numbering-step
601 T{ ##load-immediate f 2 0 }
602 T{ ##copy f 3 0 any-rep }
603 T{ ##replace f 3 D 0 }
611 T{ ##replace f 3 D 0 }
612 } value-numbering-step
619 T{ ##load-immediate f 2 0 }
620 T{ ##copy f 3 0 any-rep }
621 T{ ##replace f 3 D 0 }
629 T{ ##replace f 3 D 0 }
630 } value-numbering-step
637 T{ ##load-immediate f 2 0 }
638 T{ ##copy f 3 0 any-rep }
639 T{ ##replace f 3 D 0 }
647 T{ ##replace f 3 D 0 }
648 } value-numbering-step
655 T{ ##load-immediate f 2 0 }
656 T{ ##copy f 3 0 any-rep }
657 T{ ##replace f 3 D 0 }
665 T{ ##replace f 3 D 0 }
666 } value-numbering-step
672 T{ ##load-immediate f 1 1 }
673 T{ ##copy f 2 0 any-rep }
674 T{ ##replace f 2 D 0 }
679 T{ ##load-immediate f 1 1 }
681 T{ ##replace f 2 D 0 }
682 } value-numbering-step
689 T{ ##load-immediate f 1 1 }
690 T{ ##load-immediate f 2 3 }
691 T{ ##load-immediate f 3 4 }
696 T{ ##load-immediate f 1 1 }
697 T{ ##load-immediate f 2 3 }
699 } value-numbering-step
705 T{ ##load-immediate f 1 1 }
706 T{ ##load-immediate f 2 3 }
707 T{ ##load-immediate f 3 -2 }
712 T{ ##load-immediate f 1 1 }
713 T{ ##load-immediate f 2 3 }
715 } value-numbering-step
721 T{ ##load-immediate f 1 2 }
722 T{ ##load-immediate f 2 3 }
723 T{ ##load-immediate f 3 6 }
728 T{ ##load-immediate f 1 2 }
729 T{ ##load-immediate f 2 3 }
731 } value-numbering-step
737 T{ ##load-immediate f 1 2 }
738 T{ ##load-immediate f 2 1 }
739 T{ ##load-immediate f 3 0 }
744 T{ ##load-immediate f 1 2 }
745 T{ ##load-immediate f 2 1 }
747 } value-numbering-step
753 T{ ##load-immediate f 1 2 }
754 T{ ##load-immediate f 2 1 }
755 T{ ##load-immediate f 3 3 }
760 T{ ##load-immediate f 1 2 }
761 T{ ##load-immediate f 2 1 }
763 } value-numbering-step
769 T{ ##load-immediate f 1 2 }
770 T{ ##load-immediate f 2 3 }
771 T{ ##load-immediate f 3 1 }
776 T{ ##load-immediate f 1 2 }
777 T{ ##load-immediate f 2 3 }
779 } value-numbering-step
785 T{ ##load-immediate f 1 1 }
786 T{ ##load-immediate f 3 8 }
791 T{ ##load-immediate f 1 1 }
792 T{ ##shl-imm f 3 1 3 }
793 } value-numbering-step
800 T{ ##load-immediate f 1 -1 }
801 T{ ##load-immediate f 3 HEX: ffffffffffff }
806 T{ ##load-immediate f 1 -1 }
807 T{ ##shr-imm f 3 1 16 }
808 } value-numbering-step
815 T{ ##load-immediate f 1 -8 }
816 T{ ##load-immediate f 3 -4 }
821 T{ ##load-immediate f 1 -8 }
822 T{ ##sar-imm f 3 1 1 }
823 } value-numbering-step
830 T{ ##load-immediate f 1 65536 }
831 T{ ##load-immediate f 2 140737488355328 }
837 T{ ##load-immediate f 1 65536 }
838 T{ ##shl-imm f 2 1 31 }
840 } value-numbering-step
846 T{ ##load-immediate f 2 140737488355328 }
852 T{ ##load-immediate f 2 140737488355328 }
854 } value-numbering-step
860 T{ ##load-immediate f 2 2147483647 }
861 T{ ##add-imm f 3 0 2147483647 }
862 T{ ##add-imm f 4 3 2147483647 }
867 T{ ##load-immediate f 2 2147483647 }
870 } value-numbering-step
874 ! Displaced alien optimizations
875 3 vreg-counter set-global
880 T{ ##load-immediate f 2 16 }
881 T{ ##box-displaced-alien f 1 2 0 c-ptr }
882 T{ ##unbox-any-c-ptr f 4 0 }
883 T{ ##add-imm f 3 4 16 }
888 T{ ##load-immediate f 2 16 }
889 T{ ##box-displaced-alien f 1 2 0 c-ptr }
890 T{ ##unbox-any-c-ptr f 3 1 }
891 } value-numbering-step
894 4 vreg-counter set-global
898 T{ ##box-alien f 0 1 }
899 T{ ##load-immediate f 2 16 }
900 T{ ##box-displaced-alien f 3 2 0 c-ptr }
901 T{ ##copy f 5 1 any-rep }
902 T{ ##add-imm f 4 5 16 }
906 T{ ##box-alien f 0 1 }
907 T{ ##load-immediate f 2 16 }
908 T{ ##box-displaced-alien f 3 2 0 c-ptr }
909 T{ ##unbox-any-c-ptr f 4 3 }
910 } value-numbering-step
913 3 vreg-counter set-global
918 T{ ##load-immediate f 2 0 }
919 T{ ##copy f 3 0 any-rep }
920 T{ ##replace f 3 D 1 }
925 T{ ##load-immediate f 2 0 }
926 T{ ##box-displaced-alien f 3 2 0 c-ptr }
927 T{ ##replace f 3 D 1 }
928 } value-numbering-step
934 T{ ##load-immediate f 1 1 }
935 T{ ##load-immediate f 2 2 }
936 T{ ##load-immediate f 3 5 }
940 T{ ##load-immediate f 1 1 }
941 T{ ##load-immediate f 2 2 }
942 T{ ##compare f 3 1 2 cc= }
943 } value-numbering-step
948 T{ ##load-immediate f 1 1 }
949 T{ ##load-immediate f 2 2 }
950 T{ ##load-reference f 3 t }
954 T{ ##load-immediate f 1 1 }
955 T{ ##load-immediate f 2 2 }
956 T{ ##compare f 3 1 2 cc/= }
957 } value-numbering-step
962 T{ ##load-immediate f 1 1 }
963 T{ ##load-immediate f 2 2 }
964 T{ ##load-reference f 3 t }
968 T{ ##load-immediate f 1 1 }
969 T{ ##load-immediate f 2 2 }
970 T{ ##compare f 3 1 2 cc< }
971 } value-numbering-step
976 T{ ##load-immediate f 1 1 }
977 T{ ##load-immediate f 2 2 }
978 T{ ##load-immediate f 3 5 }
982 T{ ##load-immediate f 1 1 }
983 T{ ##load-immediate f 2 2 }
984 T{ ##compare f 3 2 1 cc< }
985 } value-numbering-step
991 T{ ##load-immediate f 1 5 }
996 T{ ##compare f 1 0 0 cc< }
997 } value-numbering-step
1003 T{ ##load-reference f 1 t }
1008 T{ ##compare f 1 0 0 cc<= }
1009 } value-numbering-step
1015 T{ ##load-immediate f 1 5 }
1020 T{ ##compare f 1 0 0 cc> }
1021 } value-numbering-step
1027 T{ ##load-reference f 1 t }
1032 T{ ##compare f 1 0 0 cc>= }
1033 } value-numbering-step
1039 T{ ##load-immediate f 1 5 }
1044 T{ ##compare f 1 0 0 cc/= }
1045 } value-numbering-step
1051 T{ ##load-reference f 1 t }
1056 T{ ##compare f 1 0 0 cc= }
1057 } value-numbering-step
1060 : test-branch-folding ( insns -- insns' n )
1062 [ V{ 0 1 } clone >>successors basic-block set value-numbering-step ] keep
1063 successors>> first ;
1067 T{ ##load-immediate f 1 1 }
1068 T{ ##load-immediate f 2 2 }
1074 T{ ##load-immediate f 1 1 }
1075 T{ ##load-immediate f 2 2 }
1076 T{ ##compare-branch f 1 2 cc= }
1077 } test-branch-folding
1082 T{ ##load-immediate f 1 1 }
1083 T{ ##load-immediate f 2 2 }
1089 T{ ##load-immediate f 1 1 }
1090 T{ ##load-immediate f 2 2 }
1091 T{ ##compare-branch f 1 2 cc/= }
1092 } test-branch-folding
1097 T{ ##load-immediate f 1 1 }
1098 T{ ##load-immediate f 2 2 }
1104 T{ ##load-immediate f 1 1 }
1105 T{ ##load-immediate f 2 2 }
1106 T{ ##compare-branch f 1 2 cc< }
1107 } test-branch-folding
1112 T{ ##load-immediate f 1 1 }
1113 T{ ##load-immediate f 2 2 }
1119 T{ ##load-immediate f 1 1 }
1120 T{ ##load-immediate f 2 2 }
1121 T{ ##compare-branch f 2 1 cc< }
1122 } test-branch-folding
1134 T{ ##compare-branch f 0 0 cc< }
1135 } test-branch-folding
1147 T{ ##compare-branch f 0 0 cc<= }
1148 } test-branch-folding
1160 T{ ##compare-branch f 0 0 cc> }
1161 } test-branch-folding
1173 T{ ##compare-branch f 0 0 cc>= }
1174 } test-branch-folding
1186 T{ ##compare-branch f 0 0 cc= }
1187 } test-branch-folding
1199 T{ ##compare-branch f 0 0 cc/= }
1200 } test-branch-folding
1206 T{ ##load-reference f 1 t }
1213 T{ ##compare f 1 0 0 cc<= }
1214 T{ ##compare-imm-branch f 1 5 cc/= }
1215 } test-branch-folding
1218 ! More branch folding tests
1219 V{ T{ ##branch } } 0 test-bb
1223 T{ ##compare-branch f 0 0 cc< }
1227 T{ ##load-immediate f 1 1 }
1232 T{ ##load-immediate f 2 2 }
1237 T{ ##phi f 3 H{ { 2 1 } { 3 2 } } }
1238 T{ ##replace f 3 D 0 }
1245 cfg new 0 get >>entry dup cfg set
1247 select-representations
1251 [ 1 ] [ 1 get successors>> length ] unit-test
1253 [ t ] [ 1 get successors>> first 3 get eq? ] unit-test
1255 [ 2 ] [ 4 get instructions>> length ] unit-test
1264 T{ ##compare-branch f 1 1 cc< }
1268 T{ ##copy f 2 0 any-rep }
1278 T{ ##replace f 3 D 0 }
1283 2 get 0 2array 2array 3 get instructions>> first (>>inputs)
1288 cfg new 0 get >>entry
1294 [ t ] [ 1 get successors>> first 3 get eq? ] unit-test
1296 [ 1 ] [ 3 get instructions>> first inputs>> assoc-size ] unit-test
1298 V{ T{ ##prologue } T{ ##branch } } 0 test-bb
1301 T{ ##peek { dst 15 } { loc D 0 } }
1302 T{ ##copy { dst 16 } { src 15 } { rep any-rep } }
1303 T{ ##copy { dst 17 } { src 15 } { rep any-rep } }
1304 T{ ##copy { dst 18 } { src 15 } { rep any-rep } }
1305 T{ ##copy { dst 19 } { src 15 } { rep any-rep } }
1313 T{ ##copy { dst 21 } { src 20 } { rep any-rep } }
1314 T{ ##compare-imm-branch
1322 T{ ##copy { dst 23 } { src 15 } { rep any-rep } }
1323 T{ ##copy { dst 24 } { src 15 } { rep any-rep } }
1324 T{ ##load-reference { dst 25 } { obj t } }
1329 T{ ##replace { src 25 } { loc D 0 } }
1335 T{ ##copy { dst 26 } { src 15 } { rep any-rep } }
1336 T{ ##copy { dst 27 } { src 15 } { rep any-rep } }
1346 T{ ##replace { src 28 } { loc D 0 } }
1357 cfg new 0 get >>entry
1358 value-numbering eliminate-dead-code drop
1361 [ f ] [ 1 get instructions>> [ ##peek? ] any? ] unit-test