]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/cfg/value-numbering/value-numbering-tests.factor
Solution to Project Euler problem 65
[factor.git] / basis / compiler / cfg / value-numbering / value-numbering-tests.factor
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
9
10 : trim-temps ( insns -- insns )
11     [
12         dup {
13             [ ##compare? ]
14             [ ##compare-imm? ]
15             [ ##compare-float-unordered? ]
16             [ ##compare-float-ordered? ]
17         } 1|| [ f >>temp ] when
18     ] map ;
19
20 ! Folding constants together
21 [
22     {
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 }
27     }
28 ] [
29     {
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
35 ] unit-test
36
37 [
38     {
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 }
43     }
44 ] [
45     {
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
51 ] unit-test
52
53 [
54     {
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 }
59     }
60 ] [
61     {
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
67 ] unit-test
68
69 ! Compare propagation
70 [
71     {
72         T{ ##load-reference f 1 + }
73         T{ ##peek f 2 D 0 }
74         T{ ##compare f 4 2 1 cc> }
75         T{ ##copy f 6 4 any-rep }
76         T{ ##replace f 6 D 0 }
77     }
78 ] [
79     {
80         T{ ##load-reference f 1 + }
81         T{ ##peek f 2 D 0 }
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
86 ] unit-test
87
88 [
89     {
90         T{ ##load-reference f 1 + }
91         T{ ##peek f 2 D 0 }
92         T{ ##compare f 4 2 1 cc<= }
93         T{ ##compare f 6 2 1 cc/<= }
94         T{ ##replace f 6 D 0 }
95     }
96 ] [
97     {
98         T{ ##load-reference f 1 + }
99         T{ ##peek f 2 D 0 }
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
104 ] unit-test
105
106 [
107     {
108         T{ ##peek f 8 D 0 }
109         T{ ##peek f 9 D -1 }
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 }
115     }
116 ] [
117     {
118         T{ ##peek f 8 D 0 }
119         T{ ##peek f 9 D -1 }
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
126 ] unit-test
127
128 [
129     {
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<= }
134     }
135 ] [
136     {
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
142 ] unit-test
143
144 ! Immediate operand conversion
145 [
146     {
147         T{ ##peek f 0 D 0 }
148         T{ ##load-immediate f 1 100 }
149         T{ ##add-imm f 2 0 100 }
150     }
151 ] [
152     {
153         T{ ##peek f 0 D 0 }
154         T{ ##load-immediate f 1 100 }
155         T{ ##add f 2 0 1 }
156     } value-numbering-step
157 ] unit-test
158
159 [
160     {
161         T{ ##peek f 0 D 0 }
162         T{ ##load-immediate f 1 100 }
163         T{ ##add-imm f 2 0 100 }
164     }
165 ] [
166     {
167         T{ ##peek f 0 D 0 }
168         T{ ##load-immediate f 1 100 }
169         T{ ##add f 2 1 0 }
170     } value-numbering-step
171 ] unit-test
172
173 [
174     {
175         T{ ##peek f 0 D 0 }
176         T{ ##load-immediate f 1 100 }
177         T{ ##add-imm f 2 0 -100 }
178     }
179 ] [
180     {
181         T{ ##peek f 0 D 0 }
182         T{ ##load-immediate f 1 100 }
183         T{ ##sub f 2 0 1 }
184     } value-numbering-step
185 ] unit-test
186
187 [
188     {
189         T{ ##peek f 0 D 0 }
190         T{ ##load-immediate f 1 0 }
191     }
192 ] [
193     {
194         T{ ##peek f 0 D 0 }
195         T{ ##sub f 1 0 0 }
196     } value-numbering-step
197 ] unit-test
198
199 [
200     {
201         T{ ##peek f 0 D 0 }
202         T{ ##load-immediate f 1 100 }
203         T{ ##mul-imm f 2 0 100 }
204     }
205 ] [
206     {
207         T{ ##peek f 0 D 0 }
208         T{ ##load-immediate f 1 100 }
209         T{ ##mul f 2 0 1 }
210     } value-numbering-step
211 ] unit-test
212
213 [
214     {
215         T{ ##peek f 0 D 0 }
216         T{ ##load-immediate f 1 100 }
217         T{ ##mul-imm f 2 0 100 }
218     }
219 ] [
220     {
221         T{ ##peek f 0 D 0 }
222         T{ ##load-immediate f 1 100 }
223         T{ ##mul f 2 1 0 }
224     } value-numbering-step
225 ] unit-test
226
227 [
228     {
229         T{ ##peek f 1 D 0 }
230         T{ ##shl-imm f 2 1 3 }
231     }
232 ] [
233     {
234         T{ ##peek f 1 D 0 }
235         T{ ##mul-imm f 2 1 8 }
236     } value-numbering-step
237 ] unit-test
238
239 [
240     {
241         T{ ##peek f 0 D 0 }
242         T{ ##load-immediate f 1 100 }
243         T{ ##and-imm f 2 0 100 }
244     }
245 ] [
246     {
247         T{ ##peek f 0 D 0 }
248         T{ ##load-immediate f 1 100 }
249         T{ ##and f 2 0 1 }
250     } value-numbering-step
251 ] unit-test
252
253 [
254     {
255         T{ ##peek f 0 D 0 }
256         T{ ##load-immediate f 1 100 }
257         T{ ##and-imm f 2 0 100 }
258     }
259 ] [
260     {
261         T{ ##peek f 0 D 0 }
262         T{ ##load-immediate f 1 100 }
263         T{ ##and f 2 1 0 }
264     } value-numbering-step
265 ] unit-test
266
267 [
268     {
269         T{ ##peek f 0 D 0 }
270         T{ ##load-immediate f 1 100 }
271         T{ ##or-imm f 2 0 100 }
272     }
273 ] [
274     {
275         T{ ##peek f 0 D 0 }
276         T{ ##load-immediate f 1 100 }
277         T{ ##or f 2 0 1 }
278     } value-numbering-step
279 ] unit-test
280
281 [
282     {
283         T{ ##peek f 0 D 0 }
284         T{ ##load-immediate f 1 100 }
285         T{ ##or-imm f 2 0 100 }
286     }
287 ] [
288     {
289         T{ ##peek f 0 D 0 }
290         T{ ##load-immediate f 1 100 }
291         T{ ##or f 2 1 0 }
292     } value-numbering-step
293 ] unit-test
294
295 [
296     {
297         T{ ##peek f 0 D 0 }
298         T{ ##load-immediate f 1 100 }
299         T{ ##xor-imm f 2 0 100 }
300     }
301 ] [
302     {
303         T{ ##peek f 0 D 0 }
304         T{ ##load-immediate f 1 100 }
305         T{ ##xor f 2 0 1 }
306     } value-numbering-step
307 ] unit-test
308
309 [
310     {
311         T{ ##peek f 0 D 0 }
312         T{ ##load-immediate f 1 100 }
313         T{ ##xor-imm f 2 0 100 }
314     }
315 ] [
316     {
317         T{ ##peek f 0 D 0 }
318         T{ ##load-immediate f 1 100 }
319         T{ ##xor f 2 1 0 }
320     } value-numbering-step
321 ] unit-test
322
323 [
324     {
325         T{ ##peek f 0 D 0 }
326         T{ ##load-immediate f 1 100 }
327         T{ ##compare-imm f 2 0 100 cc<= }
328     }
329 ] [
330     {
331         T{ ##peek f 0 D 0 }
332         T{ ##load-immediate f 1 100 }
333         T{ ##compare f 2 0 1 cc<= }
334     } value-numbering-step trim-temps
335 ] unit-test
336
337 [
338     {
339         T{ ##peek f 0 D 0 }
340         T{ ##load-immediate f 1 100 }
341         T{ ##compare-imm f 2 0 100 cc>= }
342     }
343 ] [
344     {
345         T{ ##peek f 0 D 0 }
346         T{ ##load-immediate f 1 100 }
347         T{ ##compare f 2 1 0 cc<= }
348     } value-numbering-step trim-temps
349 ] unit-test
350
351 [
352     {
353         T{ ##peek f 0 D 0 }
354         T{ ##load-immediate f 1 100 }
355         T{ ##compare-imm-branch f 0 100 cc<= }
356     }
357 ] [
358     {
359         T{ ##peek f 0 D 0 }
360         T{ ##load-immediate f 1 100 }
361         T{ ##compare-branch f 0 1 cc<= }
362     } value-numbering-step
363 ] unit-test
364
365 [
366     {
367         T{ ##peek f 0 D 0 }
368         T{ ##load-immediate f 1 100 }
369         T{ ##compare-imm-branch f 0 100 cc>= }
370     }
371 ] [
372     {
373         T{ ##peek f 0 D 0 }
374         T{ ##load-immediate f 1 100 }
375         T{ ##compare-branch f 1 0 cc<= }
376     } value-numbering-step trim-temps
377 ] unit-test
378
379 ! Reassociation
380 [
381     {
382         T{ ##peek f 0 D 0 }
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 }
387     }
388 ] [
389     {
390         T{ ##peek f 0 D 0 }
391         T{ ##load-immediate f 1 100 }
392         T{ ##add f 2 0 1 }
393         T{ ##load-immediate f 3 50 }
394         T{ ##add f 4 2 3 }
395     } value-numbering-step
396 ] unit-test
397
398 [
399     {
400         T{ ##peek f 0 D 0 }
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 }
405     }
406 ] [
407     {
408         T{ ##peek f 0 D 0 }
409         T{ ##load-immediate f 1 100 }
410         T{ ##add f 2 1 0 }
411         T{ ##load-immediate f 3 50 }
412         T{ ##add f 4 3 2 }
413     } value-numbering-step
414 ] unit-test
415
416 [
417     {
418         T{ ##peek f 0 D 0 }
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 }
423     }
424 ] [
425     {
426         T{ ##peek f 0 D 0 }
427         T{ ##load-immediate f 1 100 }
428         T{ ##add f 2 0 1 }
429         T{ ##load-immediate f 3 50 }
430         T{ ##sub f 4 2 3 }
431     } value-numbering-step
432 ] unit-test
433
434 [
435     {
436         T{ ##peek f 0 D 0 }
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 }
441     }
442 ] [
443     {
444         T{ ##peek f 0 D 0 }
445         T{ ##load-immediate f 1 100 }
446         T{ ##sub f 2 0 1 }
447         T{ ##load-immediate f 3 50 }
448         T{ ##sub f 4 2 3 }
449     } value-numbering-step
450 ] unit-test
451
452 [
453     {
454         T{ ##peek f 0 D 0 }
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 }
459     }
460 ] [
461     {
462         T{ ##peek f 0 D 0 }
463         T{ ##load-immediate f 1 100 }
464         T{ ##mul f 2 0 1 }
465         T{ ##load-immediate f 3 50 }
466         T{ ##mul f 4 2 3 }
467     } value-numbering-step
468 ] unit-test
469
470 [
471     {
472         T{ ##peek f 0 D 0 }
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 }
477     }
478 ] [
479     {
480         T{ ##peek f 0 D 0 }
481         T{ ##load-immediate f 1 100 }
482         T{ ##mul f 2 1 0 }
483         T{ ##load-immediate f 3 50 }
484         T{ ##mul f 4 3 2 }
485     } value-numbering-step
486 ] unit-test
487
488 [
489     {
490         T{ ##peek f 0 D 0 }
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 }
495     }
496 ] [
497     {
498         T{ ##peek f 0 D 0 }
499         T{ ##load-immediate f 1 100 }
500         T{ ##and f 2 0 1 }
501         T{ ##load-immediate f 3 50 }
502         T{ ##and f 4 2 3 }
503     } value-numbering-step
504 ] unit-test
505
506 [
507     {
508         T{ ##peek f 0 D 0 }
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 }
513     }
514 ] [
515     {
516         T{ ##peek f 0 D 0 }
517         T{ ##load-immediate f 1 100 }
518         T{ ##and f 2 1 0 }
519         T{ ##load-immediate f 3 50 }
520         T{ ##and f 4 3 2 }
521     } value-numbering-step
522 ] unit-test
523
524 [
525     {
526         T{ ##peek f 0 D 0 }
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 }
531     }
532 ] [
533     {
534         T{ ##peek f 0 D 0 }
535         T{ ##load-immediate f 1 100 }
536         T{ ##or f 2 0 1 }
537         T{ ##load-immediate f 3 50 }
538         T{ ##or f 4 2 3 }
539     } value-numbering-step
540 ] unit-test
541
542 [
543     {
544         T{ ##peek f 0 D 0 }
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 }
549     }
550 ] [
551     {
552         T{ ##peek f 0 D 0 }
553         T{ ##load-immediate f 1 100 }
554         T{ ##or f 2 1 0 }
555         T{ ##load-immediate f 3 50 }
556         T{ ##or f 4 3 2 }
557     } value-numbering-step
558 ] unit-test
559
560 [
561     {
562         T{ ##peek f 0 D 0 }
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 }
567     }
568 ] [
569     {
570         T{ ##peek f 0 D 0 }
571         T{ ##load-immediate f 1 100 }
572         T{ ##xor f 2 0 1 }
573         T{ ##load-immediate f 3 50 }
574         T{ ##xor f 4 2 3 }
575     } value-numbering-step
576 ] unit-test
577
578 [
579     {
580         T{ ##peek f 0 D 0 }
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 }
585     }
586 ] [
587     {
588         T{ ##peek f 0 D 0 }
589         T{ ##load-immediate f 1 100 }
590         T{ ##xor f 2 1 0 }
591         T{ ##load-immediate f 3 50 }
592         T{ ##xor f 4 3 2 }
593     } value-numbering-step
594 ] unit-test
595
596 ! Simplification
597 [
598     {
599         T{ ##peek f 0 D 0 }
600         T{ ##peek f 1 D 1 }
601         T{ ##load-immediate f 2 0 }
602         T{ ##copy f 3 0 any-rep }
603         T{ ##replace f 3 D 0 }
604     }
605 ] [
606     {
607         T{ ##peek f 0 D 0 }
608         T{ ##peek f 1 D 1 }
609         T{ ##sub f 2 1 1 }
610         T{ ##add f 3 0 2 }
611         T{ ##replace f 3 D 0 }
612     } value-numbering-step
613 ] unit-test
614
615 [
616     {
617         T{ ##peek f 0 D 0 }
618         T{ ##peek f 1 D 1 }
619         T{ ##load-immediate f 2 0 }
620         T{ ##copy f 3 0 any-rep }
621         T{ ##replace f 3 D 0 }
622     }
623 ] [
624     {
625         T{ ##peek f 0 D 0 }
626         T{ ##peek f 1 D 1 }
627         T{ ##sub f 2 1 1 }
628         T{ ##sub f 3 0 2 }
629         T{ ##replace f 3 D 0 }
630     } value-numbering-step
631 ] unit-test
632
633 [
634     {
635         T{ ##peek f 0 D 0 }
636         T{ ##peek f 1 D 1 }
637         T{ ##load-immediate f 2 0 }
638         T{ ##copy f 3 0 any-rep }
639         T{ ##replace f 3 D 0 }
640     }
641 ] [
642     {
643         T{ ##peek f 0 D 0 }
644         T{ ##peek f 1 D 1 }
645         T{ ##sub f 2 1 1 }
646         T{ ##or f 3 0 2 }
647         T{ ##replace f 3 D 0 }
648     } value-numbering-step
649 ] unit-test
650
651 [
652     {
653         T{ ##peek f 0 D 0 }
654         T{ ##peek f 1 D 1 }
655         T{ ##load-immediate f 2 0 }
656         T{ ##copy f 3 0 any-rep }
657         T{ ##replace f 3 D 0 }
658     }
659 ] [
660     {
661         T{ ##peek f 0 D 0 }
662         T{ ##peek f 1 D 1 }
663         T{ ##sub f 2 1 1 }
664         T{ ##xor f 3 0 2 }
665         T{ ##replace f 3 D 0 }
666     } value-numbering-step
667 ] unit-test
668
669 [
670     {
671         T{ ##peek f 0 D 0 }
672         T{ ##load-immediate f 1 1 }
673         T{ ##copy f 2 0 any-rep }
674         T{ ##replace f 2 D 0 }
675     }
676 ] [
677     {
678         T{ ##peek f 0 D 0 }
679         T{ ##load-immediate f 1 1 }
680         T{ ##mul f 2 0 1 }
681         T{ ##replace f 2 D 0 }
682     } value-numbering-step
683 ] unit-test
684
685 ! Constant folding
686 [
687     {
688         T{ ##peek f 0 D 0 }
689         T{ ##load-immediate f 1 1 }
690         T{ ##load-immediate f 2 3 }
691         T{ ##load-immediate f 3 4 }
692     }
693 ] [
694     {
695         T{ ##peek f 0 D 0 }
696         T{ ##load-immediate f 1 1 }
697         T{ ##load-immediate f 2 3 }
698         T{ ##add f 3 1 2 }
699     } value-numbering-step
700 ] unit-test
701
702 [
703     {
704         T{ ##peek f 0 D 0 }
705         T{ ##load-immediate f 1 1 }
706         T{ ##load-immediate f 2 3 }
707         T{ ##load-immediate f 3 -2 }
708     }
709 ] [
710     {
711         T{ ##peek f 0 D 0 }
712         T{ ##load-immediate f 1 1 }
713         T{ ##load-immediate f 2 3 }
714         T{ ##sub f 3 1 2 }
715     } value-numbering-step
716 ] unit-test
717
718 [
719     {
720         T{ ##peek f 0 D 0 }
721         T{ ##load-immediate f 1 2 }
722         T{ ##load-immediate f 2 3 }
723         T{ ##load-immediate f 3 6 }
724     }
725 ] [
726     {
727         T{ ##peek f 0 D 0 }
728         T{ ##load-immediate f 1 2 }
729         T{ ##load-immediate f 2 3 }
730         T{ ##mul f 3 1 2 }
731     } value-numbering-step
732 ] unit-test
733
734 [
735     {
736         T{ ##peek f 0 D 0 }
737         T{ ##load-immediate f 1 2 }
738         T{ ##load-immediate f 2 1 }
739         T{ ##load-immediate f 3 0 }
740     }
741 ] [
742     {
743         T{ ##peek f 0 D 0 }
744         T{ ##load-immediate f 1 2 }
745         T{ ##load-immediate f 2 1 }
746         T{ ##and f 3 1 2 }
747     } value-numbering-step
748 ] unit-test
749
750 [
751     {
752         T{ ##peek f 0 D 0 }
753         T{ ##load-immediate f 1 2 }
754         T{ ##load-immediate f 2 1 }
755         T{ ##load-immediate f 3 3 }
756     }
757 ] [
758     {
759         T{ ##peek f 0 D 0 }
760         T{ ##load-immediate f 1 2 }
761         T{ ##load-immediate f 2 1 }
762         T{ ##or f 3 1 2 }
763     } value-numbering-step
764 ] unit-test
765
766 [
767     {
768         T{ ##peek f 0 D 0 }
769         T{ ##load-immediate f 1 2 }
770         T{ ##load-immediate f 2 3 }
771         T{ ##load-immediate f 3 1 }
772     }
773 ] [
774     {
775         T{ ##peek f 0 D 0 }
776         T{ ##load-immediate f 1 2 }
777         T{ ##load-immediate f 2 3 }
778         T{ ##xor f 3 1 2 }
779     } value-numbering-step
780 ] unit-test
781
782 [
783     {
784         T{ ##peek f 0 D 0 }
785         T{ ##load-immediate f 1 1 }
786         T{ ##load-immediate f 3 8 }
787     }
788 ] [
789     {
790         T{ ##peek f 0 D 0 }
791         T{ ##load-immediate f 1 1 }
792         T{ ##shl-imm f 3 1 3 }
793     } value-numbering-step
794 ] unit-test
795
796 cell 8 = [
797     [
798         {
799             T{ ##peek f 0 D 0 }
800             T{ ##load-immediate f 1 -1 }
801             T{ ##load-immediate f 3 HEX: ffffffffffff }
802         }
803     ] [
804         {
805             T{ ##peek f 0 D 0 }
806             T{ ##load-immediate f 1 -1 }
807             T{ ##shr-imm f 3 1 16 }
808         } value-numbering-step
809     ] unit-test
810 ] when
811
812 [
813     {
814         T{ ##peek f 0 D 0 }
815         T{ ##load-immediate f 1 -8 }
816         T{ ##load-immediate f 3 -4 }
817     }
818 ] [
819     {
820         T{ ##peek f 0 D 0 }
821         T{ ##load-immediate f 1 -8 }
822         T{ ##sar-imm f 3 1 1 }
823     } value-numbering-step
824 ] unit-test
825
826 cell 8 = [
827     [
828         {
829             T{ ##peek f 0 D 0 }
830             T{ ##load-immediate f 1 65536 }
831             T{ ##load-immediate f 2 140737488355328 }
832             T{ ##add f 3 0 2 }
833         }
834     ] [
835         {
836             T{ ##peek f 0 D 0 }
837             T{ ##load-immediate f 1 65536 }
838             T{ ##shl-imm f 2 1 31 }
839             T{ ##add f 3 0 2 }
840         } value-numbering-step
841     ] unit-test
842
843     [
844         {
845             T{ ##peek f 0 D 0 }
846             T{ ##load-immediate f 2 140737488355328 }
847             T{ ##add f 3 0 2 }
848         }
849     ] [
850         {
851             T{ ##peek f 0 D 0 }
852             T{ ##load-immediate f 2 140737488355328 }
853             T{ ##add f 3 0 2 }
854         } value-numbering-step
855     ] unit-test
856
857     [
858         {
859             T{ ##peek f 0 D 0 }
860             T{ ##load-immediate f 2 2147483647 }
861             T{ ##add-imm f 3 0 2147483647 }
862             T{ ##add-imm f 4 3 2147483647 }
863         }
864     ] [
865         {
866             T{ ##peek f 0 D 0 }
867             T{ ##load-immediate f 2 2147483647 }
868             T{ ##add f 3 0 2 }
869             T{ ##add f 4 3 2 }
870         } value-numbering-step
871     ] unit-test
872 ] when
873
874 ! Displaced alien optimizations
875 3 vreg-counter set-global
876
877 [
878     {
879         T{ ##peek f 0 D 0 }
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 }
884     }
885 ] [
886     {
887         T{ ##peek f 0 D 0 }
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
892 ] unit-test
893
894 4 vreg-counter set-global
895
896 [
897     {
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 }
903     }
904 ] [
905     {
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
911 ] unit-test
912
913 3 vreg-counter set-global
914
915 [
916     {
917         T{ ##peek f 0 D 0 }
918         T{ ##load-immediate f 2 0 }
919         T{ ##copy f 3 0 any-rep }
920         T{ ##replace f 3 D 1 }
921     }
922 ] [
923     {
924         T{ ##peek f 0 D 0 }
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
929 ] unit-test
930
931 ! Branch folding
932 [
933     {
934         T{ ##load-immediate f 1 1 }
935         T{ ##load-immediate f 2 2 }
936         T{ ##load-immediate f 3 5 }
937     }
938 ] [
939     {
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
944 ] unit-test
945
946 [
947     {
948         T{ ##load-immediate f 1 1 }
949         T{ ##load-immediate f 2 2 }
950         T{ ##load-reference f 3 t }
951     }
952 ] [
953     {
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
958 ] unit-test
959
960 [
961     {
962         T{ ##load-immediate f 1 1 }
963         T{ ##load-immediate f 2 2 }
964         T{ ##load-reference f 3 t }
965     }
966 ] [
967     {
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
972 ] unit-test
973
974 [
975     {
976         T{ ##load-immediate f 1 1 }
977         T{ ##load-immediate f 2 2 }
978         T{ ##load-immediate f 3 5 }
979     }
980 ] [
981     {
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
986 ] unit-test
987
988 [
989     {
990         T{ ##peek f 0 D 0 }
991         T{ ##load-immediate f 1 5 }
992     }
993 ] [
994     {
995         T{ ##peek f 0 D 0 }
996         T{ ##compare f 1 0 0 cc< }
997     } value-numbering-step
998 ] unit-test
999
1000 [
1001     {
1002         T{ ##peek f 0 D 0 }
1003         T{ ##load-reference f 1 t }
1004     }
1005 ] [
1006     {
1007         T{ ##peek f 0 D 0 }
1008         T{ ##compare f 1 0 0 cc<= }
1009     } value-numbering-step
1010 ] unit-test
1011
1012 [
1013     {
1014         T{ ##peek f 0 D 0 }
1015         T{ ##load-immediate f 1 5 }
1016     }
1017 ] [
1018     {
1019         T{ ##peek f 0 D 0 }
1020         T{ ##compare f 1 0 0 cc> }
1021     } value-numbering-step
1022 ] unit-test
1023
1024 [
1025     {
1026         T{ ##peek f 0 D 0 }
1027         T{ ##load-reference f 1 t }
1028     }
1029 ] [
1030     {
1031         T{ ##peek f 0 D 0 }
1032         T{ ##compare f 1 0 0 cc>= }
1033     } value-numbering-step
1034 ] unit-test
1035
1036 [
1037     {
1038         T{ ##peek f 0 D 0 }
1039         T{ ##load-immediate f 1 5 }
1040     }
1041 ] [
1042     {
1043         T{ ##peek f 0 D 0 }
1044         T{ ##compare f 1 0 0 cc/= }
1045     } value-numbering-step
1046 ] unit-test
1047
1048 [
1049     {
1050         T{ ##peek f 0 D 0 }
1051         T{ ##load-reference f 1 t }
1052     }
1053 ] [
1054     {
1055         T{ ##peek f 0 D 0 }
1056         T{ ##compare f 1 0 0 cc= }
1057     } value-numbering-step
1058 ] unit-test
1059
1060 : test-branch-folding ( insns -- insns' n )
1061     <basic-block>
1062     [ V{ 0 1 } clone >>successors basic-block set value-numbering-step ] keep
1063     successors>> first ;
1064
1065 [
1066     {
1067         T{ ##load-immediate f 1 1 }
1068         T{ ##load-immediate f 2 2 }
1069         T{ ##branch }
1070     }
1071     1
1072 ] [
1073     {
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
1078 ] unit-test
1079
1080 [
1081     {
1082         T{ ##load-immediate f 1 1 }
1083         T{ ##load-immediate f 2 2 }
1084         T{ ##branch }
1085     }
1086     0
1087 ] [
1088     {
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
1093 ] unit-test
1094
1095 [
1096     {
1097         T{ ##load-immediate f 1 1 }
1098         T{ ##load-immediate f 2 2 }
1099         T{ ##branch }
1100     }
1101     0
1102 ] [
1103     {
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
1108 ] unit-test
1109
1110 [
1111     {
1112         T{ ##load-immediate f 1 1 }
1113         T{ ##load-immediate f 2 2 }
1114         T{ ##branch }
1115     }
1116     1
1117 ] [
1118     {
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
1123 ] unit-test
1124
1125 [
1126     {
1127         T{ ##peek f 0 D 0 }
1128         T{ ##branch }
1129     }
1130     1
1131 ] [
1132     {
1133         T{ ##peek f 0 D 0 }
1134         T{ ##compare-branch f 0 0 cc< }
1135     } test-branch-folding
1136 ] unit-test
1137
1138 [
1139     {
1140         T{ ##peek f 0 D 0 }
1141         T{ ##branch }
1142     }
1143     0
1144 ] [
1145     {
1146         T{ ##peek f 0 D 0 }
1147         T{ ##compare-branch f 0 0 cc<= }
1148     } test-branch-folding
1149 ] unit-test
1150
1151 [
1152     {
1153         T{ ##peek f 0 D 0 }
1154         T{ ##branch }
1155     }
1156     1
1157 ] [
1158     {
1159         T{ ##peek f 0 D 0 }
1160         T{ ##compare-branch f 0 0 cc> }
1161     } test-branch-folding
1162 ] unit-test
1163
1164 [
1165     {
1166         T{ ##peek f 0 D 0 }
1167         T{ ##branch }
1168     }
1169     0
1170 ] [
1171     {
1172         T{ ##peek f 0 D 0 }
1173         T{ ##compare-branch f 0 0 cc>= }
1174     } test-branch-folding
1175 ] unit-test
1176
1177 [
1178     {
1179         T{ ##peek f 0 D 0 }
1180         T{ ##branch }
1181     }
1182     0
1183 ] [
1184     {
1185         T{ ##peek f 0 D 0 }
1186         T{ ##compare-branch f 0 0 cc= }
1187     } test-branch-folding
1188 ] unit-test
1189
1190 [
1191     {
1192         T{ ##peek f 0 D 0 }
1193         T{ ##branch }
1194     }
1195     1
1196 ] [
1197     {
1198         T{ ##peek f 0 D 0 }
1199         T{ ##compare-branch f 0 0 cc/= }
1200     } test-branch-folding
1201 ] unit-test
1202
1203 [
1204     {
1205         T{ ##peek f 0 D 0 }
1206         T{ ##load-reference f 1 t }
1207         T{ ##branch }
1208     }
1209     0
1210 ] [
1211     {
1212         T{ ##peek f 0 D 0 }
1213         T{ ##compare f 1 0 0 cc<= }
1214         T{ ##compare-imm-branch f 1 5 cc/= }
1215     } test-branch-folding
1216 ] unit-test
1217
1218 ! More branch folding tests
1219 V{ T{ ##branch } } 0 test-bb
1220
1221 V{
1222     T{ ##peek f 0 D 0 }
1223     T{ ##compare-branch f 0 0 cc< }
1224 } 1 test-bb
1225
1226 V{
1227     T{ ##load-immediate f 1 1 }
1228     T{ ##branch }
1229 } 2 test-bb
1230
1231 V{
1232     T{ ##load-immediate f 2 2 }
1233     T{ ##branch }
1234 } 3 test-bb
1235
1236 V{
1237     T{ ##phi f 3 H{ { 2 1 } { 3 2 } } }
1238     T{ ##replace f 3 D 0 }
1239     T{ ##return }
1240 } 4 test-bb
1241
1242 test-diamond
1243
1244 [ ] [
1245     cfg new 0 get >>entry dup cfg set
1246     value-numbering
1247     select-representations
1248     destruct-ssa drop
1249 ] unit-test
1250
1251 [ 1 ] [ 1 get successors>> length ] unit-test
1252
1253 [ t ] [ 1 get successors>> first 3 get eq? ] unit-test
1254
1255 [ 2 ] [ 4 get instructions>> length ] unit-test
1256
1257 V{
1258     T{ ##peek f 0 D 0 }
1259     T{ ##branch }
1260 } 0 test-bb
1261
1262 V{
1263     T{ ##peek f 1 D 1 }
1264     T{ ##compare-branch f 1 1 cc< }
1265 } 1 test-bb
1266
1267 V{
1268     T{ ##copy f 2 0 any-rep }
1269     T{ ##branch }
1270 } 2 test-bb
1271
1272 V{
1273     T{ ##phi f 3 V{ } }
1274     T{ ##branch }
1275 } 3 test-bb
1276
1277 V{
1278     T{ ##replace f 3 D 0 }
1279     T{ ##return }
1280 } 4 test-bb
1281
1282 1 get 1 2array
1283 2 get 0 2array 2array 3 get instructions>> first (>>inputs)
1284
1285 test-diamond
1286
1287 [ ] [
1288     cfg new 0 get >>entry
1289     value-numbering
1290     eliminate-dead-code
1291     drop
1292 ] unit-test
1293
1294 [ t ] [ 1 get successors>> first 3 get eq? ] unit-test
1295
1296 [ 1 ] [ 3 get instructions>> first inputs>> assoc-size ] unit-test
1297
1298 V{ T{ ##prologue } T{ ##branch } } 0 test-bb
1299
1300 V{
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 } }
1306     T{ ##compare
1307         { dst 20 }
1308         { src1 18 }
1309         { src2 19 }
1310         { cc cc= }
1311         { temp 22 }
1312     }
1313     T{ ##copy { dst 21 } { src 20 } { rep any-rep } }
1314     T{ ##compare-imm-branch
1315         { src1 21 }
1316         { src2 5 }
1317         { cc cc/= }
1318     }
1319 } 1 test-bb
1320
1321 V{
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 } }
1325     T{ ##branch }
1326 } 2 test-bb
1327
1328 V{
1329     T{ ##replace { src 25 } { loc D 0 } }
1330     T{ ##epilogue }
1331     T{ ##return }
1332 } 3 test-bb
1333
1334 V{
1335     T{ ##copy { dst 26 } { src 15 } { rep any-rep } }
1336     T{ ##copy { dst 27 } { src 15 } { rep any-rep } }
1337     T{ ##add
1338         { dst 28 }
1339         { src1 26 }
1340         { src2 27 }
1341     }
1342     T{ ##branch }
1343 } 4 test-bb
1344
1345 V{
1346     T{ ##replace { src 28 } { loc D 0 } }
1347     T{ ##epilogue }
1348     T{ ##return }
1349 } 5 test-bb
1350
1351 0 1 edge
1352 1 { 2 4 } edges
1353 2 3 edge
1354 4 5 edge
1355
1356 [ ] [
1357     cfg new 0 get >>entry
1358     value-numbering eliminate-dead-code drop
1359 ] unit-test
1360
1361 [ f ] [ 1 get instructions>> [ ##peek? ] any? ] unit-test
1362