]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/cfg/value-numbering/value-numbering-tests.factor
Merge branch 'master' of git://factorcode.org/git/factor
[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 literals 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             [ ##test-vector? ]
18             [ ##test-vector-branch? ]
19         } 1|| [ f >>temp ] when
20     ] map ;
21
22 ! Folding constants together
23 [
24     {
25         T{ ##load-constant f 0 0.0 }
26         T{ ##load-constant f 1 -0.0 }
27         T{ ##replace f 0 D 0 }
28         T{ ##replace f 1 D 1 }
29     }
30 ] [
31     {
32         T{ ##load-constant f 0 0.0 }
33         T{ ##load-constant f 1 -0.0 }
34         T{ ##replace f 0 D 0 }
35         T{ ##replace f 1 D 1 }
36     } value-numbering-step
37 ] unit-test
38
39 [
40     {
41         T{ ##load-constant f 0 0.0 }
42         T{ ##copy f 1 0 any-rep }
43         T{ ##replace f 0 D 0 }
44         T{ ##replace f 1 D 1 }
45     }
46 ] [
47     {
48         T{ ##load-constant f 0 0.0 }
49         T{ ##load-constant f 1 0.0 }
50         T{ ##replace f 0 D 0 }
51         T{ ##replace f 1 D 1 }
52     } value-numbering-step
53 ] unit-test
54
55 [
56     {
57         T{ ##load-constant f 0 t }
58         T{ ##copy f 1 0 any-rep }
59         T{ ##replace f 0 D 0 }
60         T{ ##replace f 1 D 1 }
61     }
62 ] [
63     {
64         T{ ##load-constant f 0 t }
65         T{ ##load-constant f 1 t }
66         T{ ##replace f 0 D 0 }
67         T{ ##replace f 1 D 1 }
68     } value-numbering-step
69 ] unit-test
70
71 ! Compare propagation
72 [
73     {
74         T{ ##load-reference f 1 + }
75         T{ ##peek f 2 D 0 }
76         T{ ##compare f 4 2 1 cc> }
77         T{ ##copy f 6 4 any-rep }
78         T{ ##replace f 6 D 0 }
79     }
80 ] [
81     {
82         T{ ##load-reference f 1 + }
83         T{ ##peek f 2 D 0 }
84         T{ ##compare f 4 2 1 cc> }
85         T{ ##compare-imm f 6 4 5 cc/= }
86         T{ ##replace f 6 D 0 }
87     } value-numbering-step trim-temps
88 ] unit-test
89
90 [
91     {
92         T{ ##load-reference f 1 + }
93         T{ ##peek f 2 D 0 }
94         T{ ##compare f 4 2 1 cc<= }
95         T{ ##compare f 6 2 1 cc/<= }
96         T{ ##replace f 6 D 0 }
97     }
98 ] [
99     {
100         T{ ##load-reference f 1 + }
101         T{ ##peek f 2 D 0 }
102         T{ ##compare f 4 2 1 cc<= }
103         T{ ##compare-imm f 6 4 5 cc= }
104         T{ ##replace f 6 D 0 }
105     } value-numbering-step trim-temps
106 ] unit-test
107
108 [
109     {
110         T{ ##peek f 8 D 0 }
111         T{ ##peek f 9 D -1 }
112         T{ ##compare-float-unordered f 12 8 9 cc< }
113         T{ ##compare-float-unordered f 14 8 9 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{ ##compare-float-unordered f 12 8 9 cc< }
121         T{ ##compare-imm f 14 12 5 cc= }
122         T{ ##replace f 14 D 0 }
123     } value-numbering-step trim-temps
124 ] unit-test
125
126 [
127     {
128         T{ ##peek f 29 D -1 }
129         T{ ##peek f 30 D -2 }
130         T{ ##compare f 33 29 30 cc<= }
131         T{ ##compare-branch f 29 30 cc<= }
132     }
133 ] [
134     {
135         T{ ##peek f 29 D -1 }
136         T{ ##peek f 30 D -2 }
137         T{ ##compare f 33 29 30 cc<= }
138         T{ ##compare-imm-branch f 33 5 cc/= }
139     } value-numbering-step trim-temps
140 ] unit-test
141
142 [
143     {
144         T{ ##peek f 1 D -1 }
145         T{ ##test-vector f 2 1 f float-4-rep vcc-any }
146         T{ ##test-vector-branch f 1 f float-4-rep vcc-any }
147     }
148 ] [
149     {
150         T{ ##peek f 1 D -1 }
151         T{ ##test-vector f 2 1 f float-4-rep vcc-any }
152         T{ ##compare-imm-branch f 2 5 cc/= }
153     } value-numbering-step trim-temps
154 ] unit-test
155
156 ! Immediate operand conversion
157 [
158     {
159         T{ ##peek f 0 D 0 }
160         T{ ##load-immediate f 1 100 }
161         T{ ##add-imm f 2 0 100 }
162     }
163 ] [
164     {
165         T{ ##peek f 0 D 0 }
166         T{ ##load-immediate f 1 100 }
167         T{ ##add f 2 0 1 }
168     } value-numbering-step
169 ] unit-test
170
171 [
172     {
173         T{ ##peek f 0 D 0 }
174         T{ ##load-immediate f 1 100 }
175         T{ ##add-imm f 2 0 100 }
176     }
177 ] [
178     {
179         T{ ##peek f 0 D 0 }
180         T{ ##load-immediate f 1 100 }
181         T{ ##add f 2 1 0 }
182     } value-numbering-step
183 ] unit-test
184
185 [
186     {
187         T{ ##peek f 0 D 0 }
188         T{ ##load-immediate f 1 100 }
189         T{ ##add-imm f 2 0 -100 }
190     }
191 ] [
192     {
193         T{ ##peek f 0 D 0 }
194         T{ ##load-immediate f 1 100 }
195         T{ ##sub f 2 0 1 }
196     } value-numbering-step
197 ] unit-test
198
199 [
200     {
201         T{ ##peek f 0 D 0 }
202         T{ ##load-immediate f 1 0 }
203     }
204 ] [
205     {
206         T{ ##peek f 0 D 0 }
207         T{ ##sub f 1 0 0 }
208     } value-numbering-step
209 ] unit-test
210
211 [
212     {
213         T{ ##peek f 0 D 0 }
214         T{ ##load-immediate f 1 100 }
215         T{ ##mul-imm f 2 0 100 }
216     }
217 ] [
218     {
219         T{ ##peek f 0 D 0 }
220         T{ ##load-immediate f 1 100 }
221         T{ ##mul f 2 0 1 }
222     } value-numbering-step
223 ] unit-test
224
225 [
226     {
227         T{ ##peek f 0 D 0 }
228         T{ ##load-immediate f 1 100 }
229         T{ ##mul-imm f 2 0 100 }
230     }
231 ] [
232     {
233         T{ ##peek f 0 D 0 }
234         T{ ##load-immediate f 1 100 }
235         T{ ##mul f 2 1 0 }
236     } value-numbering-step
237 ] unit-test
238
239 [
240     {
241         T{ ##peek f 1 D 0 }
242         T{ ##shl-imm f 2 1 3 }
243     }
244 ] [
245     {
246         T{ ##peek f 1 D 0 }
247         T{ ##mul-imm f 2 1 8 }
248     } value-numbering-step
249 ] unit-test
250
251 [
252     {
253         T{ ##peek f 0 D 0 }
254         T{ ##load-immediate f 1 -1 }
255         T{ ##neg f 2 0 }
256     }
257 ] [
258     {
259         T{ ##peek f 0 D 0 }
260         T{ ##load-immediate f 1 -1 }
261         T{ ##mul f 2 0 1 }
262     } value-numbering-step
263 ] unit-test
264
265 [
266     {
267         T{ ##peek f 0 D 0 }
268         T{ ##load-immediate f 1 -1 }
269         T{ ##neg f 2 0 }
270     }
271 ] [
272     {
273         T{ ##peek f 0 D 0 }
274         T{ ##load-immediate f 1 -1 }
275         T{ ##mul f 2 1 0 }
276     } value-numbering-step
277 ] unit-test
278
279 [
280     {
281         T{ ##peek f 0 D 0 }
282         T{ ##load-immediate f 1 0 }
283         T{ ##neg f 2 0 }
284     }
285 ] [
286     {
287         T{ ##peek f 0 D 0 }
288         T{ ##load-immediate f 1 0 }
289         T{ ##sub f 2 1 0 }
290     } value-numbering-step
291 ] unit-test
292
293 [
294     {
295         T{ ##peek f 0 D 0 }
296         T{ ##load-immediate f 1 0 }
297         T{ ##neg f 2 0 }
298         T{ ##copy f 3 0 any-rep }
299     }
300 ] [
301     {
302         T{ ##peek f 0 D 0 }
303         T{ ##load-immediate f 1 0 }
304         T{ ##sub f 2 1 0 }
305         T{ ##sub f 3 1 2 }
306     } value-numbering-step
307 ] unit-test
308
309 [
310     {
311         T{ ##peek f 0 D 0 }
312         T{ ##not f 1 0 }
313         T{ ##copy f 2 0 any-rep }
314     }
315 ] [
316     {
317         T{ ##peek f 0 D 0 }
318         T{ ##not f 1 0 }
319         T{ ##not f 2 1 }
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{ ##and-imm f 2 0 100 }
328     }
329 ] [
330     {
331         T{ ##peek f 0 D 0 }
332         T{ ##load-immediate f 1 100 }
333         T{ ##and f 2 0 1 }
334     } value-numbering-step
335 ] unit-test
336
337 [
338     {
339         T{ ##peek f 0 D 0 }
340         T{ ##load-immediate f 1 100 }
341         T{ ##and-imm f 2 0 100 }
342     }
343 ] [
344     {
345         T{ ##peek f 0 D 0 }
346         T{ ##load-immediate f 1 100 }
347         T{ ##and f 2 1 0 }
348     } value-numbering-step
349 ] unit-test
350
351 [
352     {
353         T{ ##peek f 0 D 0 }
354         T{ ##load-immediate f 1 100 }
355         T{ ##or-imm f 2 0 100 }
356     }
357 ] [
358     {
359         T{ ##peek f 0 D 0 }
360         T{ ##load-immediate f 1 100 }
361         T{ ##or f 2 0 1 }
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{ ##or-imm f 2 0 100 }
370     }
371 ] [
372     {
373         T{ ##peek f 0 D 0 }
374         T{ ##load-immediate f 1 100 }
375         T{ ##or f 2 1 0 }
376     } value-numbering-step
377 ] unit-test
378
379 [
380     {
381         T{ ##peek f 0 D 0 }
382         T{ ##load-immediate f 1 100 }
383         T{ ##xor-imm f 2 0 100 }
384     }
385 ] [
386     {
387         T{ ##peek f 0 D 0 }
388         T{ ##load-immediate f 1 100 }
389         T{ ##xor f 2 0 1 }
390     } value-numbering-step
391 ] unit-test
392
393 [
394     {
395         T{ ##peek f 0 D 0 }
396         T{ ##load-immediate f 1 100 }
397         T{ ##xor-imm f 2 0 100 }
398     }
399 ] [
400     {
401         T{ ##peek f 0 D 0 }
402         T{ ##load-immediate f 1 100 }
403         T{ ##xor f 2 1 0 }
404     } value-numbering-step
405 ] unit-test
406
407 [
408     {
409         T{ ##peek f 0 D 0 }
410         T{ ##load-immediate f 1 100 }
411         T{ ##compare-imm f 2 0 100 cc<= }
412     }
413 ] [
414     {
415         T{ ##peek f 0 D 0 }
416         T{ ##load-immediate f 1 100 }
417         T{ ##compare f 2 0 1 cc<= }
418     } value-numbering-step trim-temps
419 ] unit-test
420
421 [
422     {
423         T{ ##peek f 0 D 0 }
424         T{ ##load-constant f 1 3.5 }
425         T{ ##compare f 2 0 1 cc= }
426     }
427 ] [
428     {
429         T{ ##peek f 0 D 0 }
430         T{ ##load-constant f 1 3.5 }
431         T{ ##compare f 2 0 1 cc= }
432     } value-numbering-step trim-temps
433 ] unit-test
434
435 [
436     {
437         T{ ##peek f 0 D 0 }
438         T{ ##load-immediate f 1 100 }
439         T{ ##compare-imm f 2 0 100 cc>= }
440     }
441 ] [
442     {
443         T{ ##peek f 0 D 0 }
444         T{ ##load-immediate f 1 100 }
445         T{ ##compare f 2 1 0 cc<= }
446     } value-numbering-step trim-temps
447 ] unit-test
448
449 [
450     {
451         T{ ##peek f 0 D 0 }
452         T{ ##load-immediate f 1 100 }
453         T{ ##compare-imm-branch f 0 100 cc<= }
454     }
455 ] [
456     {
457         T{ ##peek f 0 D 0 }
458         T{ ##load-immediate f 1 100 }
459         T{ ##compare-branch f 0 1 cc<= }
460     } value-numbering-step
461 ] unit-test
462
463 [
464     {
465         T{ ##peek f 0 D 0 }
466         T{ ##load-constant f 1 3.5 }
467         T{ ##compare-branch f 0 1 cc= }
468     }
469 ] [
470     {
471         T{ ##peek f 0 D 0 }
472         T{ ##load-constant f 1 3.5 }
473         T{ ##compare-branch f 0 1 cc= }
474     } value-numbering-step trim-temps
475 ] unit-test
476
477 [
478     {
479         T{ ##peek f 0 D 0 }
480         T{ ##load-immediate f 1 100 }
481         T{ ##compare-imm-branch f 0 100 cc>= }
482     }
483 ] [
484     {
485         T{ ##peek f 0 D 0 }
486         T{ ##load-immediate f 1 100 }
487         T{ ##compare-branch f 1 0 cc<= }
488     } value-numbering-step trim-temps
489 ] unit-test
490
491 ! Reassociation
492 [
493     {
494         T{ ##peek f 0 D 0 }
495         T{ ##load-immediate f 1 100 }
496         T{ ##add-imm f 2 0 100 }
497         T{ ##load-immediate f 3 50 }
498         T{ ##add-imm f 4 0 150 }
499     }
500 ] [
501     {
502         T{ ##peek f 0 D 0 }
503         T{ ##load-immediate f 1 100 }
504         T{ ##add f 2 0 1 }
505         T{ ##load-immediate f 3 50 }
506         T{ ##add f 4 2 3 }
507     } value-numbering-step
508 ] unit-test
509
510 [
511     {
512         T{ ##peek f 0 D 0 }
513         T{ ##load-immediate f 1 100 }
514         T{ ##add-imm f 2 0 100 }
515         T{ ##load-immediate f 3 50 }
516         T{ ##add-imm f 4 0 150 }
517     }
518 ] [
519     {
520         T{ ##peek f 0 D 0 }
521         T{ ##load-immediate f 1 100 }
522         T{ ##add f 2 1 0 }
523         T{ ##load-immediate f 3 50 }
524         T{ ##add f 4 3 2 }
525     } value-numbering-step
526 ] unit-test
527
528 [
529     {
530         T{ ##peek f 0 D 0 }
531         T{ ##load-immediate f 1 100 }
532         T{ ##add-imm f 2 0 100 }
533         T{ ##load-immediate f 3 50 }
534         T{ ##add-imm f 4 0 50 }
535     }
536 ] [
537     {
538         T{ ##peek f 0 D 0 }
539         T{ ##load-immediate f 1 100 }
540         T{ ##add f 2 0 1 }
541         T{ ##load-immediate f 3 50 }
542         T{ ##sub f 4 2 3 }
543     } value-numbering-step
544 ] unit-test
545
546 [
547     {
548         T{ ##peek f 0 D 0 }
549         T{ ##load-immediate f 1 100 }
550         T{ ##add-imm f 2 0 -100 }
551         T{ ##load-immediate f 3 50 }
552         T{ ##add-imm f 4 0 -150 }
553     }
554 ] [
555     {
556         T{ ##peek f 0 D 0 }
557         T{ ##load-immediate f 1 100 }
558         T{ ##sub f 2 0 1 }
559         T{ ##load-immediate f 3 50 }
560         T{ ##sub f 4 2 3 }
561     } value-numbering-step
562 ] unit-test
563
564 [
565     {
566         T{ ##peek f 0 D 0 }
567         T{ ##load-immediate f 1 100 }
568         T{ ##mul-imm f 2 0 100 }
569         T{ ##load-immediate f 3 50 }
570         T{ ##mul-imm f 4 0 5000 }
571     }
572 ] [
573     {
574         T{ ##peek f 0 D 0 }
575         T{ ##load-immediate f 1 100 }
576         T{ ##mul f 2 0 1 }
577         T{ ##load-immediate f 3 50 }
578         T{ ##mul f 4 2 3 }
579     } value-numbering-step
580 ] unit-test
581
582 [
583     {
584         T{ ##peek f 0 D 0 }
585         T{ ##load-immediate f 1 100 }
586         T{ ##mul-imm f 2 0 100 }
587         T{ ##load-immediate f 3 50 }
588         T{ ##mul-imm f 4 0 5000 }
589     }
590 ] [
591     {
592         T{ ##peek f 0 D 0 }
593         T{ ##load-immediate f 1 100 }
594         T{ ##mul f 2 1 0 }
595         T{ ##load-immediate f 3 50 }
596         T{ ##mul f 4 3 2 }
597     } value-numbering-step
598 ] unit-test
599
600 [
601     {
602         T{ ##peek f 0 D 0 }
603         T{ ##load-immediate f 1 100 }
604         T{ ##and-imm f 2 0 100 }
605         T{ ##load-immediate f 3 50 }
606         T{ ##and-imm f 4 0 32 }
607     }
608 ] [
609     {
610         T{ ##peek f 0 D 0 }
611         T{ ##load-immediate f 1 100 }
612         T{ ##and f 2 0 1 }
613         T{ ##load-immediate f 3 50 }
614         T{ ##and f 4 2 3 }
615     } value-numbering-step
616 ] unit-test
617
618 [
619     {
620         T{ ##peek f 0 D 0 }
621         T{ ##load-immediate f 1 100 }
622         T{ ##and-imm f 2 0 100 }
623         T{ ##load-immediate f 3 50 }
624         T{ ##and-imm f 4 0 32 }
625     }
626 ] [
627     {
628         T{ ##peek f 0 D 0 }
629         T{ ##load-immediate f 1 100 }
630         T{ ##and f 2 1 0 }
631         T{ ##load-immediate f 3 50 }
632         T{ ##and f 4 3 2 }
633     } value-numbering-step
634 ] unit-test
635
636 [
637     {
638         T{ ##peek f 0 D 0 }
639         T{ ##load-immediate f 1 100 }
640         T{ ##or-imm f 2 0 100 }
641         T{ ##load-immediate f 3 50 }
642         T{ ##or-imm f 4 0 118 }
643     }
644 ] [
645     {
646         T{ ##peek f 0 D 0 }
647         T{ ##load-immediate f 1 100 }
648         T{ ##or f 2 0 1 }
649         T{ ##load-immediate f 3 50 }
650         T{ ##or f 4 2 3 }
651     } value-numbering-step
652 ] unit-test
653
654 [
655     {
656         T{ ##peek f 0 D 0 }
657         T{ ##load-immediate f 1 100 }
658         T{ ##or-imm f 2 0 100 }
659         T{ ##load-immediate f 3 50 }
660         T{ ##or-imm f 4 0 118 }
661     }
662 ] [
663     {
664         T{ ##peek f 0 D 0 }
665         T{ ##load-immediate f 1 100 }
666         T{ ##or f 2 1 0 }
667         T{ ##load-immediate f 3 50 }
668         T{ ##or f 4 3 2 }
669     } value-numbering-step
670 ] unit-test
671
672 [
673     {
674         T{ ##peek f 0 D 0 }
675         T{ ##load-immediate f 1 100 }
676         T{ ##xor-imm f 2 0 100 }
677         T{ ##load-immediate f 3 50 }
678         T{ ##xor-imm f 4 0 86 }
679     }
680 ] [
681     {
682         T{ ##peek f 0 D 0 }
683         T{ ##load-immediate f 1 100 }
684         T{ ##xor f 2 0 1 }
685         T{ ##load-immediate f 3 50 }
686         T{ ##xor f 4 2 3 }
687     } value-numbering-step
688 ] unit-test
689
690 [
691     {
692         T{ ##peek f 0 D 0 }
693         T{ ##load-immediate f 1 100 }
694         T{ ##xor-imm f 2 0 100 }
695         T{ ##load-immediate f 3 50 }
696         T{ ##xor-imm f 4 0 86 }
697     }
698 ] [
699     {
700         T{ ##peek f 0 D 0 }
701         T{ ##load-immediate f 1 100 }
702         T{ ##xor f 2 1 0 }
703         T{ ##load-immediate f 3 50 }
704         T{ ##xor f 4 3 2 }
705     } value-numbering-step
706 ] unit-test
707
708 ! Simplification
709 [
710     {
711         T{ ##peek f 0 D 0 }
712         T{ ##peek f 1 D 1 }
713         T{ ##load-immediate f 2 0 }
714         T{ ##copy f 3 0 any-rep }
715         T{ ##replace f 3 D 0 }
716     }
717 ] [
718     {
719         T{ ##peek f 0 D 0 }
720         T{ ##peek f 1 D 1 }
721         T{ ##sub f 2 1 1 }
722         T{ ##add f 3 0 2 }
723         T{ ##replace f 3 D 0 }
724     } value-numbering-step
725 ] unit-test
726
727 [
728     {
729         T{ ##peek f 0 D 0 }
730         T{ ##peek f 1 D 1 }
731         T{ ##load-immediate f 2 0 }
732         T{ ##copy f 3 0 any-rep }
733         T{ ##replace f 3 D 0 }
734     }
735 ] [
736     {
737         T{ ##peek f 0 D 0 }
738         T{ ##peek f 1 D 1 }
739         T{ ##sub f 2 1 1 }
740         T{ ##sub f 3 0 2 }
741         T{ ##replace f 3 D 0 }
742     } value-numbering-step
743 ] unit-test
744
745 [
746     {
747         T{ ##peek f 0 D 0 }
748         T{ ##peek f 1 D 1 }
749         T{ ##load-immediate f 2 0 }
750         T{ ##copy f 3 0 any-rep }
751         T{ ##replace f 3 D 0 }
752     }
753 ] [
754     {
755         T{ ##peek f 0 D 0 }
756         T{ ##peek f 1 D 1 }
757         T{ ##sub f 2 1 1 }
758         T{ ##or f 3 0 2 }
759         T{ ##replace f 3 D 0 }
760     } value-numbering-step
761 ] unit-test
762
763 [
764     {
765         T{ ##peek f 0 D 0 }
766         T{ ##peek f 1 D 1 }
767         T{ ##load-immediate f 2 0 }
768         T{ ##copy f 3 0 any-rep }
769         T{ ##replace f 3 D 0 }
770     }
771 ] [
772     {
773         T{ ##peek f 0 D 0 }
774         T{ ##peek f 1 D 1 }
775         T{ ##sub f 2 1 1 }
776         T{ ##xor f 3 0 2 }
777         T{ ##replace f 3 D 0 }
778     } value-numbering-step
779 ] unit-test
780
781 [
782     {
783         T{ ##peek f 0 D 0 }
784         T{ ##load-immediate f 1 1 }
785         T{ ##copy f 2 0 any-rep }
786         T{ ##replace f 2 D 0 }
787     }
788 ] [
789     {
790         T{ ##peek f 0 D 0 }
791         T{ ##load-immediate f 1 1 }
792         T{ ##mul f 2 0 1 }
793         T{ ##replace f 2 D 0 }
794     } value-numbering-step
795 ] unit-test
796
797 ! Constant folding
798 [
799     {
800         T{ ##peek f 0 D 0 }
801         T{ ##load-immediate f 1 1 }
802         T{ ##load-immediate f 2 3 }
803         T{ ##load-immediate f 3 4 }
804     }
805 ] [
806     {
807         T{ ##peek f 0 D 0 }
808         T{ ##load-immediate f 1 1 }
809         T{ ##load-immediate f 2 3 }
810         T{ ##add f 3 1 2 }
811     } value-numbering-step
812 ] unit-test
813
814 [
815     {
816         T{ ##peek f 0 D 0 }
817         T{ ##load-immediate f 1 1 }
818         T{ ##load-immediate f 2 3 }
819         T{ ##load-immediate f 3 -2 }
820     }
821 ] [
822     {
823         T{ ##peek f 0 D 0 }
824         T{ ##load-immediate f 1 1 }
825         T{ ##load-immediate f 2 3 }
826         T{ ##sub f 3 1 2 }
827     } value-numbering-step
828 ] unit-test
829
830 [
831     {
832         T{ ##peek f 0 D 0 }
833         T{ ##load-immediate f 1 2 }
834         T{ ##load-immediate f 2 3 }
835         T{ ##load-immediate f 3 6 }
836     }
837 ] [
838     {
839         T{ ##peek f 0 D 0 }
840         T{ ##load-immediate f 1 2 }
841         T{ ##load-immediate f 2 3 }
842         T{ ##mul f 3 1 2 }
843     } value-numbering-step
844 ] unit-test
845
846 [
847     {
848         T{ ##peek f 0 D 0 }
849         T{ ##load-immediate f 1 2 }
850         T{ ##load-immediate f 2 1 }
851         T{ ##load-immediate f 3 0 }
852     }
853 ] [
854     {
855         T{ ##peek f 0 D 0 }
856         T{ ##load-immediate f 1 2 }
857         T{ ##load-immediate f 2 1 }
858         T{ ##and f 3 1 2 }
859     } value-numbering-step
860 ] unit-test
861
862 [
863     {
864         T{ ##peek f 0 D 0 }
865         T{ ##load-immediate f 1 2 }
866         T{ ##load-immediate f 2 1 }
867         T{ ##load-immediate f 3 3 }
868     }
869 ] [
870     {
871         T{ ##peek f 0 D 0 }
872         T{ ##load-immediate f 1 2 }
873         T{ ##load-immediate f 2 1 }
874         T{ ##or f 3 1 2 }
875     } value-numbering-step
876 ] unit-test
877
878 [
879     {
880         T{ ##peek f 0 D 0 }
881         T{ ##load-immediate f 1 2 }
882         T{ ##load-immediate f 2 3 }
883         T{ ##load-immediate f 3 1 }
884     }
885 ] [
886     {
887         T{ ##peek f 0 D 0 }
888         T{ ##load-immediate f 1 2 }
889         T{ ##load-immediate f 2 3 }
890         T{ ##xor f 3 1 2 }
891     } value-numbering-step
892 ] unit-test
893
894 [
895     {
896         T{ ##peek f 0 D 0 }
897         T{ ##load-immediate f 1 1 }
898         T{ ##load-immediate f 3 8 }
899     }
900 ] [
901     {
902         T{ ##peek f 0 D 0 }
903         T{ ##load-immediate f 1 1 }
904         T{ ##shl-imm f 3 1 3 }
905     } value-numbering-step
906 ] unit-test
907
908 cell 8 = [
909     [
910         {
911             T{ ##peek f 0 D 0 }
912             T{ ##load-immediate f 1 -1 }
913             T{ ##load-immediate f 3 HEX: ffffffffffff }
914         }
915     ] [
916         {
917             T{ ##peek f 0 D 0 }
918             T{ ##load-immediate f 1 -1 }
919             T{ ##shr-imm f 3 1 16 }
920         } value-numbering-step
921     ] unit-test
922 ] when
923
924 [
925     {
926         T{ ##peek f 0 D 0 }
927         T{ ##load-immediate f 1 -8 }
928         T{ ##load-immediate f 3 -4 }
929     }
930 ] [
931     {
932         T{ ##peek f 0 D 0 }
933         T{ ##load-immediate f 1 -8 }
934         T{ ##sar-imm f 3 1 1 }
935     } value-numbering-step
936 ] unit-test
937
938 cell 8 = [
939     [
940         {
941             T{ ##peek f 0 D 0 }
942             T{ ##load-immediate f 1 65536 }
943             T{ ##load-immediate f 2 140737488355328 }
944             T{ ##add f 3 0 2 }
945         }
946     ] [
947         {
948             T{ ##peek f 0 D 0 }
949             T{ ##load-immediate f 1 65536 }
950             T{ ##shl-imm f 2 1 31 }
951             T{ ##add f 3 0 2 }
952         } value-numbering-step
953     ] unit-test
954
955     [
956         {
957             T{ ##peek f 0 D 0 }
958             T{ ##load-immediate f 2 140737488355328 }
959             T{ ##add f 3 0 2 }
960         }
961     ] [
962         {
963             T{ ##peek f 0 D 0 }
964             T{ ##load-immediate f 2 140737488355328 }
965             T{ ##add f 3 0 2 }
966         } value-numbering-step
967     ] unit-test
968
969     [
970         {
971             T{ ##peek f 0 D 0 }
972             T{ ##load-immediate f 2 2147483647 }
973             T{ ##add-imm f 3 0 2147483647 }
974             T{ ##add-imm f 4 3 2147483647 }
975         }
976     ] [
977         {
978             T{ ##peek f 0 D 0 }
979             T{ ##load-immediate f 2 2147483647 }
980             T{ ##add f 3 0 2 }
981             T{ ##add f 4 3 2 }
982         } value-numbering-step
983     ] unit-test
984 ] when
985
986 [
987     {
988         T{ ##peek f 0 D 0 }
989         T{ ##load-immediate f 1 1 }
990         T{ ##load-immediate f 2 -1 }
991     }
992 ] [
993     {
994         T{ ##peek f 0 D 0 }
995         T{ ##load-immediate f 1 1 }
996         T{ ##neg f 2 1 }
997     } value-numbering-step
998 ] unit-test
999
1000 [
1001     {
1002         T{ ##peek f 0 D 0 }
1003         T{ ##load-immediate f 1 1 }
1004         T{ ##load-immediate f 2 -2 }
1005     }
1006 ] [
1007     {
1008         T{ ##peek f 0 D 0 }
1009         T{ ##load-immediate f 1 1 }
1010         T{ ##not f 2 1 }
1011     } value-numbering-step
1012 ] unit-test
1013
1014 ! Displaced alien optimizations
1015 3 vreg-counter set-global
1016
1017 [
1018     {
1019         T{ ##peek f 0 D 0 }
1020         T{ ##load-immediate f 2 16 }
1021         T{ ##box-displaced-alien f 1 2 0 c-ptr }
1022         T{ ##unbox-any-c-ptr f 4 0 }
1023         T{ ##add-imm f 3 4 16 }
1024     }
1025 ] [
1026     {
1027         T{ ##peek f 0 D 0 }
1028         T{ ##load-immediate f 2 16 }
1029         T{ ##box-displaced-alien f 1 2 0 c-ptr }
1030         T{ ##unbox-any-c-ptr f 3 1 }
1031     } value-numbering-step
1032 ] unit-test
1033
1034 4 vreg-counter set-global
1035
1036 [
1037     {
1038         T{ ##box-alien f 0 1 }
1039         T{ ##load-immediate f 2 16 }
1040         T{ ##box-displaced-alien f 3 2 0 c-ptr }
1041         T{ ##copy f 5 1 any-rep }
1042         T{ ##add-imm f 4 5 16 }
1043     }
1044 ] [
1045     {
1046         T{ ##box-alien f 0 1 }
1047         T{ ##load-immediate f 2 16 }
1048         T{ ##box-displaced-alien f 3 2 0 c-ptr }
1049         T{ ##unbox-any-c-ptr f 4 3 }
1050     } value-numbering-step
1051 ] unit-test
1052
1053 3 vreg-counter set-global
1054
1055 [
1056     {
1057         T{ ##peek f 0 D 0 }
1058         T{ ##load-immediate f 2 0 }
1059         T{ ##copy f 3 0 any-rep }
1060         T{ ##replace f 3 D 1 }
1061     }
1062 ] [
1063     {
1064         T{ ##peek f 0 D 0 }
1065         T{ ##load-immediate f 2 0 }
1066         T{ ##box-displaced-alien f 3 2 0 c-ptr }
1067         T{ ##replace f 3 D 1 }
1068     } value-numbering-step
1069 ] unit-test
1070
1071 ! Branch folding
1072 [
1073     {
1074         T{ ##load-immediate f 1 1 }
1075         T{ ##load-immediate f 2 2 }
1076         T{ ##load-immediate f 3 5 }
1077     }
1078 ] [
1079     {
1080         T{ ##load-immediate f 1 1 }
1081         T{ ##load-immediate f 2 2 }
1082         T{ ##compare f 3 1 2 cc= }
1083     } value-numbering-step
1084 ] unit-test
1085
1086 [
1087     {
1088         T{ ##load-immediate f 1 1 }
1089         T{ ##load-immediate f 2 2 }
1090         T{ ##load-constant f 3 t }
1091     }
1092 ] [
1093     {
1094         T{ ##load-immediate f 1 1 }
1095         T{ ##load-immediate f 2 2 }
1096         T{ ##compare f 3 1 2 cc/= }
1097     } value-numbering-step
1098 ] unit-test
1099
1100 [
1101     {
1102         T{ ##load-immediate f 1 1 }
1103         T{ ##load-immediate f 2 2 }
1104         T{ ##load-constant f 3 t }
1105     }
1106 ] [
1107     {
1108         T{ ##load-immediate f 1 1 }
1109         T{ ##load-immediate f 2 2 }
1110         T{ ##compare f 3 1 2 cc< }
1111     } value-numbering-step
1112 ] unit-test
1113
1114 [
1115     {
1116         T{ ##load-immediate f 1 1 }
1117         T{ ##load-immediate f 2 2 }
1118         T{ ##load-immediate f 3 5 }
1119     }
1120 ] [
1121     {
1122         T{ ##load-immediate f 1 1 }
1123         T{ ##load-immediate f 2 2 }
1124         T{ ##compare f 3 2 1 cc< }
1125     } value-numbering-step
1126 ] unit-test
1127
1128 [
1129     {
1130         T{ ##peek f 0 D 0 }
1131         T{ ##load-immediate f 1 5 }
1132     }
1133 ] [
1134     {
1135         T{ ##peek f 0 D 0 }
1136         T{ ##compare f 1 0 0 cc< }
1137     } value-numbering-step
1138 ] unit-test
1139
1140 [
1141     {
1142         T{ ##peek f 0 D 0 }
1143         T{ ##load-constant f 1 t }
1144     }
1145 ] [
1146     {
1147         T{ ##peek f 0 D 0 }
1148         T{ ##compare f 1 0 0 cc<= }
1149     } value-numbering-step
1150 ] unit-test
1151
1152 [
1153     {
1154         T{ ##peek f 0 D 0 }
1155         T{ ##load-immediate f 1 5 }
1156     }
1157 ] [
1158     {
1159         T{ ##peek f 0 D 0 }
1160         T{ ##compare f 1 0 0 cc> }
1161     } value-numbering-step
1162 ] unit-test
1163
1164 [
1165     {
1166         T{ ##peek f 0 D 0 }
1167         T{ ##load-constant f 1 t }
1168     }
1169 ] [
1170     {
1171         T{ ##peek f 0 D 0 }
1172         T{ ##compare f 1 0 0 cc>= }
1173     } value-numbering-step
1174 ] unit-test
1175
1176 [
1177     {
1178         T{ ##peek f 0 D 0 }
1179         T{ ##load-immediate f 1 5 }
1180     }
1181 ] [
1182     {
1183         T{ ##peek f 0 D 0 }
1184         T{ ##compare f 1 0 0 cc/= }
1185     } value-numbering-step
1186 ] unit-test
1187
1188 [
1189     {
1190         T{ ##peek f 0 D 0 }
1191         T{ ##load-constant f 1 t }
1192     }
1193 ] [
1194     {
1195         T{ ##peek f 0 D 0 }
1196         T{ ##compare f 1 0 0 cc= }
1197     } value-numbering-step
1198 ] unit-test
1199
1200 [
1201     {
1202         T{ ##vector>scalar f 1 0 float-4-rep }
1203         T{ ##copy f 2 0 any-rep }
1204     }
1205 ] [
1206     {
1207         T{ ##vector>scalar f 1 0 float-4-rep }
1208         T{ ##scalar>vector f 2 1 float-4-rep }
1209     } value-numbering-step
1210 ] unit-test
1211
1212 [
1213     {
1214         T{ ##copy f 1 0 any-rep }
1215     }
1216 ] [
1217     {
1218         T{ ##shuffle-vector-imm f 1 0 { 0 1 2 3 } float-4-rep }
1219     } value-numbering-step
1220 ] unit-test
1221
1222 [
1223     {
1224         T{ ##shuffle-vector-imm f 1 0 { 1 2 3 0 } float-4-rep }
1225         T{ ##shuffle-vector-imm f 2 0 { 0 2 3 1 } float-4-rep }
1226     }
1227 ] [
1228     {
1229         T{ ##shuffle-vector-imm f 1 0 { 1 2 3 0 } float-4-rep }
1230         T{ ##shuffle-vector-imm f 2 1 { 3 1 2 0 } float-4-rep }
1231     } value-numbering-step
1232 ] unit-test
1233
1234 [
1235     {
1236         T{ ##shuffle-vector-imm f 1 0 { 1 2 3 0 } float-4-rep }
1237         T{ ##shuffle-vector-imm f 2 1 { 1 0 } double-2-rep }
1238     }
1239 ] [
1240     {
1241         T{ ##shuffle-vector-imm f 1 0 { 1 2 3 0 } float-4-rep }
1242         T{ ##shuffle-vector-imm f 2 1 { 1 0 } double-2-rep }
1243     } value-numbering-step
1244 ] unit-test
1245
1246 [
1247     {
1248         T{ ##load-constant f 0 $[ 55 tag-fixnum ] }
1249         T{ ##load-constant f 1 B{ 55 0 0 0  55 0 0 0  55 0 0 0  55 0 0 0 } }
1250         T{ ##copy f 2 1 any-rep }
1251     }
1252 ] [
1253     {
1254         T{ ##load-constant f 0 $[ 55 tag-fixnum ] }
1255         T{ ##scalar>vector f 1 0 int-4-rep }
1256         T{ ##shuffle-vector-imm f 2 1 { 0 0 0 0 } float-4-rep }
1257     } value-numbering-step
1258 ] unit-test
1259
1260 [
1261     {
1262         T{ ##load-constant f 0 1.25 }
1263         T{ ##load-constant f 1 B{ 0 0 160 63 0 0 160 63 0 0 160 63 0 0 160 63 } }
1264         T{ ##copy f 2 1 any-rep }
1265     }
1266 ] [
1267     {
1268         T{ ##load-constant f 0 1.25 }
1269         T{ ##scalar>vector f 1 0 float-4-rep }
1270         T{ ##shuffle-vector-imm f 2 1 { 0 0 0 0 } float-4-rep }
1271     } value-numbering-step
1272 ] unit-test
1273
1274 [
1275     {
1276         T{ ##zero-vector f 2 float-4-rep }
1277     }
1278 ] [
1279     {
1280         T{ ##xor-vector f 2 1 1 float-4-rep }
1281     } value-numbering-step
1282 ] unit-test
1283
1284 ! NOT x AND y => x ANDN y
1285
1286 [
1287     {
1288         T{ ##fill-vector f 3 float-4-rep }
1289         T{ ##xor-vector  f 4 0 3 float-4-rep }
1290         T{ ##andn-vector f 5 0 1 float-4-rep }
1291     }
1292 ] [
1293     {
1294         T{ ##fill-vector f 3 float-4-rep }
1295         T{ ##xor-vector  f 4 0 3 float-4-rep }
1296         T{ ##and-vector  f 5 4 1 float-4-rep }
1297     } value-numbering-step
1298 ] unit-test
1299
1300 [
1301     {
1302         T{ ##not-vector  f 4 0 float-4-rep }
1303         T{ ##andn-vector f 5 0 1 float-4-rep }
1304     }
1305 ] [
1306     {
1307         T{ ##not-vector  f 4 0 float-4-rep }
1308         T{ ##and-vector  f 5 4 1 float-4-rep }
1309     } value-numbering-step
1310 ] unit-test
1311
1312 ! x AND NOT y => y ANDN x
1313
1314 [
1315     {
1316         T{ ##fill-vector f 3 float-4-rep }
1317         T{ ##xor-vector  f 4 0 3 float-4-rep }
1318         T{ ##andn-vector f 5 0 1 float-4-rep }
1319     }
1320 ] [
1321     {
1322         T{ ##fill-vector f 3 float-4-rep }
1323         T{ ##xor-vector  f 4 0 3 float-4-rep }
1324         T{ ##and-vector  f 5 1 4 float-4-rep }
1325     } value-numbering-step
1326 ] unit-test
1327
1328 [
1329     {
1330         T{ ##not-vector  f 4 0 float-4-rep }
1331         T{ ##andn-vector f 5 0 1 float-4-rep }
1332     }
1333 ] [
1334     {
1335         T{ ##not-vector  f 4 0 float-4-rep }
1336         T{ ##and-vector  f 5 1 4 float-4-rep }
1337     } value-numbering-step
1338 ] unit-test
1339
1340 ! NOT x ANDN y => x AND y
1341
1342 [
1343     {
1344         T{ ##fill-vector f 3 float-4-rep }
1345         T{ ##xor-vector  f 4 0 3 float-4-rep }
1346         T{ ##and-vector  f 5 0 1 float-4-rep }
1347     }
1348 ] [
1349     {
1350         T{ ##fill-vector f 3 float-4-rep }
1351         T{ ##xor-vector  f 4 0 3 float-4-rep }
1352         T{ ##andn-vector f 5 4 1 float-4-rep }
1353     } value-numbering-step
1354 ] unit-test
1355
1356 [
1357     {
1358         T{ ##not-vector  f 4 0 float-4-rep }
1359         T{ ##and-vector  f 5 0 1 float-4-rep }
1360     }
1361 ] [
1362     {
1363         T{ ##not-vector  f 4 0 float-4-rep }
1364         T{ ##andn-vector f 5 4 1 float-4-rep }
1365     } value-numbering-step
1366 ] unit-test
1367
1368 ! AND <=> ANDN
1369
1370 [
1371     {
1372         T{ ##fill-vector f 3 float-4-rep }
1373         T{ ##xor-vector  f 4 0 3 float-4-rep }
1374         T{ ##andn-vector f 5 0 1 float-4-rep }
1375         T{ ##and-vector  f 6 0 2 float-4-rep }
1376         T{ ##or-vector   f 7 5 6 float-4-rep }
1377     }
1378 ] [
1379     {
1380         T{ ##fill-vector f 3 float-4-rep }
1381         T{ ##xor-vector  f 4 0 3 float-4-rep }
1382         T{ ##and-vector  f 5 4 1 float-4-rep }
1383         T{ ##andn-vector f 6 4 2 float-4-rep }
1384         T{ ##or-vector   f 7 5 6 float-4-rep }
1385     } value-numbering-step
1386 ] unit-test
1387
1388 [
1389     {
1390         T{ ##not-vector  f 4 0   float-4-rep }
1391         T{ ##andn-vector f 5 0 1 float-4-rep }
1392         T{ ##and-vector  f 6 0 2 float-4-rep }
1393         T{ ##or-vector   f 7 5 6 float-4-rep }
1394     }
1395 ] [
1396     {
1397         T{ ##not-vector  f 4 0   float-4-rep }
1398         T{ ##and-vector  f 5 4 1 float-4-rep }
1399         T{ ##andn-vector f 6 4 2 float-4-rep }
1400         T{ ##or-vector   f 7 5 6 float-4-rep }
1401     } value-numbering-step
1402 ] unit-test
1403
1404 ! branch folding
1405
1406 : test-branch-folding ( insns -- insns' n )
1407     <basic-block>
1408     [ V{ 0 1 } clone >>successors basic-block set value-numbering-step ] keep
1409     successors>> first ;
1410
1411 [
1412     {
1413         T{ ##load-immediate f 1 1 }
1414         T{ ##load-immediate f 2 2 }
1415         T{ ##branch }
1416     }
1417     1
1418 ] [
1419     {
1420         T{ ##load-immediate f 1 1 }
1421         T{ ##load-immediate f 2 2 }
1422         T{ ##compare-branch f 1 2 cc= }
1423     } test-branch-folding
1424 ] unit-test
1425
1426 [
1427     {
1428         T{ ##load-immediate f 1 1 }
1429         T{ ##load-immediate f 2 2 }
1430         T{ ##branch }
1431     }
1432     0
1433 ] [
1434     {
1435         T{ ##load-immediate f 1 1 }
1436         T{ ##load-immediate f 2 2 }
1437         T{ ##compare-branch f 1 2 cc/= }
1438     } test-branch-folding
1439 ] unit-test
1440
1441 [
1442     {
1443         T{ ##load-immediate f 1 1 }
1444         T{ ##load-immediate f 2 2 }
1445         T{ ##branch }
1446     }
1447     0
1448 ] [
1449     {
1450         T{ ##load-immediate f 1 1 }
1451         T{ ##load-immediate f 2 2 }
1452         T{ ##compare-branch f 1 2 cc< }
1453     } test-branch-folding
1454 ] unit-test
1455
1456 [
1457     {
1458         T{ ##load-immediate f 1 1 }
1459         T{ ##load-immediate f 2 2 }
1460         T{ ##branch }
1461     }
1462     1
1463 ] [
1464     {
1465         T{ ##load-immediate f 1 1 }
1466         T{ ##load-immediate f 2 2 }
1467         T{ ##compare-branch f 2 1 cc< }
1468     } test-branch-folding
1469 ] unit-test
1470
1471 [
1472     {
1473         T{ ##peek f 0 D 0 }
1474         T{ ##branch }
1475     }
1476     1
1477 ] [
1478     {
1479         T{ ##peek f 0 D 0 }
1480         T{ ##compare-branch f 0 0 cc< }
1481     } test-branch-folding
1482 ] unit-test
1483
1484 [
1485     {
1486         T{ ##peek f 0 D 0 }
1487         T{ ##branch }
1488     }
1489     0
1490 ] [
1491     {
1492         T{ ##peek f 0 D 0 }
1493         T{ ##compare-branch f 0 0 cc<= }
1494     } test-branch-folding
1495 ] unit-test
1496
1497 [
1498     {
1499         T{ ##peek f 0 D 0 }
1500         T{ ##branch }
1501     }
1502     1
1503 ] [
1504     {
1505         T{ ##peek f 0 D 0 }
1506         T{ ##compare-branch f 0 0 cc> }
1507     } test-branch-folding
1508 ] unit-test
1509
1510 [
1511     {
1512         T{ ##peek f 0 D 0 }
1513         T{ ##branch }
1514     }
1515     0
1516 ] [
1517     {
1518         T{ ##peek f 0 D 0 }
1519         T{ ##compare-branch f 0 0 cc>= }
1520     } test-branch-folding
1521 ] unit-test
1522
1523 [
1524     {
1525         T{ ##peek f 0 D 0 }
1526         T{ ##branch }
1527     }
1528     0
1529 ] [
1530     {
1531         T{ ##peek f 0 D 0 }
1532         T{ ##compare-branch f 0 0 cc= }
1533     } test-branch-folding
1534 ] unit-test
1535
1536 [
1537     {
1538         T{ ##peek f 0 D 0 }
1539         T{ ##branch }
1540     }
1541     1
1542 ] [
1543     {
1544         T{ ##peek f 0 D 0 }
1545         T{ ##compare-branch f 0 0 cc/= }
1546     } test-branch-folding
1547 ] unit-test
1548
1549 [
1550     {
1551         T{ ##peek f 0 D 0 }
1552         T{ ##load-constant f 1 t }
1553         T{ ##branch }
1554     }
1555     0
1556 ] [
1557     {
1558         T{ ##peek f 0 D 0 }
1559         T{ ##compare f 1 0 0 cc<= }
1560         T{ ##compare-imm-branch f 1 5 cc/= }
1561     } test-branch-folding
1562 ] unit-test
1563
1564 ! More branch folding tests
1565 V{ T{ ##branch } } 0 test-bb
1566
1567 V{
1568     T{ ##peek f 0 D 0 }
1569     T{ ##compare-branch f 0 0 cc< }
1570 } 1 test-bb
1571
1572 V{
1573     T{ ##load-immediate f 1 1 }
1574     T{ ##branch }
1575 } 2 test-bb
1576
1577 V{
1578     T{ ##load-immediate f 2 2 }
1579     T{ ##branch }
1580 } 3 test-bb
1581
1582 V{
1583     T{ ##phi f 3 H{ { 2 1 } { 3 2 } } }
1584     T{ ##replace f 3 D 0 }
1585     T{ ##return }
1586 } 4 test-bb
1587
1588 test-diamond
1589
1590 [ ] [
1591     cfg new 0 get >>entry dup cfg set
1592     value-numbering
1593     select-representations
1594     destruct-ssa drop
1595 ] unit-test
1596
1597 [ 1 ] [ 1 get successors>> length ] unit-test
1598
1599 [ t ] [ 1 get successors>> first 3 get eq? ] unit-test
1600
1601 [ 2 ] [ 4 get instructions>> length ] unit-test
1602
1603 V{
1604     T{ ##peek f 0 D 0 }
1605     T{ ##branch }
1606 } 0 test-bb
1607
1608 V{
1609     T{ ##peek f 1 D 1 }
1610     T{ ##compare-branch f 1 1 cc< }
1611 } 1 test-bb
1612
1613 V{
1614     T{ ##copy f 2 0 any-rep }
1615     T{ ##branch }
1616 } 2 test-bb
1617
1618 V{
1619     T{ ##phi f 3 V{ } }
1620     T{ ##branch }
1621 } 3 test-bb
1622
1623 V{
1624     T{ ##replace f 3 D 0 }
1625     T{ ##return }
1626 } 4 test-bb
1627
1628 1 get 1 2array
1629 2 get 0 2array 2array 3 get instructions>> first (>>inputs)
1630
1631 test-diamond
1632
1633 [ ] [
1634     cfg new 0 get >>entry
1635     value-numbering
1636     eliminate-dead-code
1637     drop
1638 ] unit-test
1639
1640 [ t ] [ 1 get successors>> first 3 get eq? ] unit-test
1641
1642 [ 1 ] [ 3 get instructions>> first inputs>> assoc-size ] unit-test
1643
1644 V{ T{ ##prologue } T{ ##branch } } 0 test-bb
1645
1646 V{
1647     T{ ##peek { dst 15 } { loc D 0 } }
1648     T{ ##copy { dst 16 } { src 15 } { rep any-rep } }
1649     T{ ##copy { dst 17 } { src 15 } { rep any-rep } }
1650     T{ ##copy { dst 18 } { src 15 } { rep any-rep } }
1651     T{ ##copy { dst 19 } { src 15 } { rep any-rep } }
1652     T{ ##compare
1653         { dst 20 }
1654         { src1 18 }
1655         { src2 19 }
1656         { cc cc= }
1657         { temp 22 }
1658     }
1659     T{ ##copy { dst 21 } { src 20 } { rep any-rep } }
1660     T{ ##compare-imm-branch
1661         { src1 21 }
1662         { src2 5 }
1663         { cc cc/= }
1664     }
1665 } 1 test-bb
1666
1667 V{
1668     T{ ##copy { dst 23 } { src 15 } { rep any-rep } }
1669     T{ ##copy { dst 24 } { src 15 } { rep any-rep } }
1670     T{ ##load-reference { dst 25 } { obj t } }
1671     T{ ##branch }
1672 } 2 test-bb
1673
1674 V{
1675     T{ ##replace { src 25 } { loc D 0 } }
1676     T{ ##epilogue }
1677     T{ ##return }
1678 } 3 test-bb
1679
1680 V{
1681     T{ ##copy { dst 26 } { src 15 } { rep any-rep } }
1682     T{ ##copy { dst 27 } { src 15 } { rep any-rep } }
1683     T{ ##add
1684         { dst 28 }
1685         { src1 26 }
1686         { src2 27 }
1687     }
1688     T{ ##branch }
1689 } 4 test-bb
1690
1691 V{
1692     T{ ##replace { src 28 } { loc D 0 } }
1693     T{ ##epilogue }
1694     T{ ##return }
1695 } 5 test-bb
1696
1697 0 1 edge
1698 1 { 2 4 } edges
1699 2 3 edge
1700 4 5 edge
1701
1702 [ ] [
1703     cfg new 0 get >>entry
1704     value-numbering eliminate-dead-code drop
1705 ] unit-test
1706
1707 [ f ] [ 1 get instructions>> [ ##peek? ] any? ] unit-test
1708