]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/cfg/value-numbering/value-numbering-tests.factor
use radix literals
[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 compiler.cfg.value-numbering.simd
8 system ;
9 QUALIFIED-WITH: alien.c-types c
10 IN: compiler.cfg.value-numbering.tests
11
12 : trim-temps ( insns -- insns )
13     [
14         dup {
15             [ ##compare? ]
16             [ ##compare-imm? ]
17             [ ##compare-integer? ]
18             [ ##compare-integer-imm? ]
19             [ ##compare-float-unordered? ]
20             [ ##compare-float-ordered? ]
21             [ ##test? ]
22             [ ##test-imm? ]
23             [ ##test-vector? ]
24             [ ##test-vector-branch? ]
25         } 1|| [ f >>temp ] when
26     ] map ;
27
28 ! Folding constants together
29 [
30     {
31         T{ ##load-reference f 0 0.0 }
32         T{ ##load-reference f 1 -0.0 }
33     }
34 ] [
35     {
36         T{ ##load-reference f 0 0.0 }
37         T{ ##load-reference f 1 -0.0 }
38     } value-numbering-step
39 ] unit-test
40
41 [
42     {
43         T{ ##load-reference f 0 0.0 }
44         T{ ##copy f 1 0 any-rep }
45     }
46 ] [
47     {
48         T{ ##load-reference f 0 0.0 }
49         T{ ##load-reference f 1 0.0 }
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     }
58 ] [
59     {
60         T{ ##load-reference f 0 t }
61         T{ ##load-reference f 1 t }
62     } value-numbering-step
63 ] unit-test
64
65 ! ##load-reference/##replace fusion
66 cpu x86? [
67     [
68         {
69             T{ ##load-integer f 0 10 }
70             T{ ##replace-imm f 10 D 0 }
71         }
72     ] [
73         {
74             T{ ##load-integer f 0 10 }
75             T{ ##replace f 0 D 0 }
76         } value-numbering-step
77     ] unit-test
78
79     [
80         {
81             T{ ##load-reference f 0 f }
82             T{ ##replace-imm f f D 0 }
83         }
84     ] [
85         {
86             T{ ##load-reference f 0 f }
87             T{ ##replace f 0 D 0 }
88         } value-numbering-step
89     ] unit-test
90 ] when
91
92 cpu x86.32? [
93     [
94         {
95             T{ ##load-reference f 0 + }
96             T{ ##replace-imm f + D 0 }
97         }
98     ] [
99         {
100             T{ ##load-reference f 0 + }
101             T{ ##replace f 0 D 0 }
102         } value-numbering-step
103     ] unit-test
104 ] when
105
106 cpu x86.64? [
107     [
108         {
109             T{ ##load-integer f 0 10,000,000,000 }
110             T{ ##replace f 0 D 0 }
111         }
112     ] [
113         {
114             T{ ##load-integer f 0 10,000,000,000 }
115             T{ ##replace f 0 D 0 }
116         } value-numbering-step
117     ] unit-test
118
119     ! Boundary case
120     [
121         {
122             T{ ##load-integer f 0 0x7fffffff }
123             T{ ##replace f 0 D 0 }
124         }
125     ] [
126         {
127             T{ ##load-integer f 0 0x7fffffff }
128             T{ ##replace f 0 D 0 }
129         } value-numbering-step
130     ] unit-test
131 ] when
132
133 ! Double compare elimination
134 [
135     {
136         T{ ##peek f 1 D 1 }
137         T{ ##peek f 2 D 2 }
138         T{ ##compare f 4 2 1 cc= }
139         T{ ##copy f 6 4 any-rep }
140         T{ ##replace f 6 D 0 }
141     }
142 ] [
143     {
144         T{ ##peek f 1 D 1 }
145         T{ ##peek f 2 D 2 }
146         T{ ##compare f 4 2 1 cc= }
147         T{ ##compare-imm f 6 4 f cc/= }
148         T{ ##replace f 6 D 0 }
149     } value-numbering-step trim-temps
150 ] unit-test
151
152 [
153     {
154         T{ ##peek f 1 D 1 }
155         T{ ##compare-imm f 2 1 16 cc= }
156         T{ ##copy f 3 2 any-rep }
157         T{ ##replace f 3 D 0 }
158     }
159 ] [
160     {
161         T{ ##peek f 1 D 1 }
162         T{ ##compare-imm f 2 1 16 cc= }
163         T{ ##compare-imm f 3 2 f cc/= }
164         T{ ##replace f 3 D 0 }
165     } value-numbering-step trim-temps
166 ] unit-test
167
168 [
169     {
170         T{ ##peek f 1 D 1 }
171         T{ ##peek f 2 D 2 }
172         T{ ##compare-integer f 4 2 1 cc> }
173         T{ ##copy f 6 4 any-rep }
174         T{ ##replace f 6 D 0 }
175     }
176 ] [
177     {
178         T{ ##peek f 1 D 1 }
179         T{ ##peek f 2 D 2 }
180         T{ ##compare-integer f 4 2 1 cc> }
181         T{ ##compare-imm f 6 4 f cc/= }
182         T{ ##replace f 6 D 0 }
183     } value-numbering-step trim-temps
184 ] unit-test
185
186 [
187     {
188         T{ ##peek f 1 D 1 }
189         T{ ##peek f 2 D 2 }
190         T{ ##compare-integer f 4 2 1 cc<= }
191         T{ ##compare-integer f 6 2 1 cc/<= }
192         T{ ##replace f 6 D 0 }
193     }
194 ] [
195     {
196         T{ ##peek f 1 D 1 }
197         T{ ##peek f 2 D 2 }
198         T{ ##compare-integer f 4 2 1 cc<= }
199         T{ ##compare-imm f 6 4 f cc= }
200         T{ ##replace f 6 D 0 }
201     } value-numbering-step trim-temps
202 ] unit-test
203
204 [
205     {
206         T{ ##peek f 1 D 1 }
207         T{ ##compare-integer-imm f 2 1 100 cc<= }
208         T{ ##compare-integer-imm f 3 1 100 cc/<= }
209         T{ ##replace f 3 D 0 }
210     }
211 ] [
212     {
213         T{ ##peek f 1 D 1 }
214         T{ ##compare-integer-imm f 2 1 100 cc<= }
215         T{ ##compare-imm f 3 2 f cc= }
216         T{ ##replace f 3 D 0 }
217     } value-numbering-step trim-temps
218 ] unit-test
219
220 [
221     {
222         T{ ##peek f 8 D 0 }
223         T{ ##peek f 9 D -1 }
224         T{ ##compare-float-unordered f 12 8 9 cc< }
225         T{ ##compare-float-unordered f 14 8 9 cc/< }
226         T{ ##replace f 14 D 0 }
227     }
228 ] [
229     {
230         T{ ##peek f 8 D 0 }
231         T{ ##peek f 9 D -1 }
232         T{ ##compare-float-unordered f 12 8 9 cc< }
233         T{ ##compare-imm f 14 12 f cc= }
234         T{ ##replace f 14 D 0 }
235     } value-numbering-step trim-temps
236 ] unit-test
237
238 [
239     {
240         T{ ##peek f 29 D -1 }
241         T{ ##peek f 30 D -2 }
242         T{ ##compare f 33 29 30 cc= }
243         T{ ##compare-branch f 29 30 cc= }
244     }
245 ] [
246     {
247         T{ ##peek f 29 D -1 }
248         T{ ##peek f 30 D -2 }
249         T{ ##compare f 33 29 30 cc= }
250         T{ ##compare-imm-branch f 33 f cc/= }
251     } value-numbering-step trim-temps
252 ] unit-test
253
254 [
255     {
256         T{ ##peek f 29 D -1 }
257         T{ ##peek f 30 D -2 }
258         T{ ##compare-integer f 33 29 30 cc<= }
259         T{ ##compare-integer-branch f 29 30 cc<= }
260     }
261 ] [
262     {
263         T{ ##peek f 29 D -1 }
264         T{ ##peek f 30 D -2 }
265         T{ ##compare-integer f 33 29 30 cc<= }
266         T{ ##compare-imm-branch f 33 f cc/= }
267     } value-numbering-step trim-temps
268 ] unit-test
269
270 [
271     {
272         T{ ##peek f 29 D -1 }
273         T{ ##peek f 30 D -2 }
274         T{ ##test f 33 29 30 cc= }
275         T{ ##test-branch f 29 30 cc= }
276     }
277 ] [
278     {
279         T{ ##peek f 29 D -1 }
280         T{ ##peek f 30 D -2 }
281         T{ ##test f 33 29 30 cc= }
282         T{ ##compare-imm-branch f 33 f cc/= }
283     } value-numbering-step trim-temps
284 ] unit-test
285
286 [
287     {
288         T{ ##peek f 29 D -1 }
289         T{ ##test-imm f 33 29 30 cc= }
290         T{ ##test-imm-branch f 29 30 cc= }
291     }
292 ] [
293     {
294         T{ ##peek f 29 D -1 }
295         T{ ##test-imm f 33 29 30 cc= }
296         T{ ##compare-imm-branch f 33 f cc/= }
297     } value-numbering-step trim-temps
298 ] unit-test
299
300 [
301     {
302         T{ ##peek f 1 D -1 }
303         T{ ##test-vector f 2 1 f float-4-rep vcc-any }
304         T{ ##test-vector-branch f 1 f float-4-rep vcc-any }
305     }
306 ] [
307     {
308         T{ ##peek f 1 D -1 }
309         T{ ##test-vector f 2 1 f float-4-rep vcc-any }
310         T{ ##compare-imm-branch f 2 f cc/= }
311     } value-numbering-step trim-temps
312 ] unit-test
313
314 cpu x86.32? [
315     [
316         {
317             T{ ##peek f 1 D 0 }
318             T{ ##compare-imm f 2 1 + cc= }
319             T{ ##compare-imm-branch f 1 + cc= }
320         }
321     ] [
322         {
323             T{ ##peek f 1 D 0 }
324             T{ ##compare-imm f 2 1 + cc= }
325             T{ ##compare-imm-branch f 2 f cc/= }
326         } value-numbering-step trim-temps
327     ] unit-test
328 ] when
329
330 ! Immediate operand fusion
331 [
332     {
333         T{ ##peek f 0 D 0 }
334         T{ ##load-integer f 1 100 }
335         T{ ##add-imm f 2 0 100 }
336     }
337 ] [
338     {
339         T{ ##peek f 0 D 0 }
340         T{ ##load-integer f 1 100 }
341         T{ ##add f 2 0 1 }
342     } value-numbering-step
343 ] unit-test
344
345 [
346     {
347         T{ ##peek f 0 D 0 }
348         T{ ##load-integer f 1 100 }
349         T{ ##add-imm f 2 0 100 }
350     }
351 ] [
352     {
353         T{ ##peek f 0 D 0 }
354         T{ ##load-integer f 1 100 }
355         T{ ##add f 2 1 0 }
356     } value-numbering-step
357 ] unit-test
358
359 [
360     {
361         T{ ##peek f 0 D 0 }
362         T{ ##load-integer f 1 100 }
363         T{ ##add-imm f 2 0 -100 }
364     }
365 ] [
366     {
367         T{ ##peek f 0 D 0 }
368         T{ ##load-integer f 1 100 }
369         T{ ##sub f 2 0 1 }
370     } value-numbering-step
371 ] unit-test
372
373 [
374     {
375         T{ ##peek f 0 D 0 }
376         T{ ##load-integer f 1 0 }
377     }
378 ] [
379     {
380         T{ ##peek f 0 D 0 }
381         T{ ##sub f 1 0 0 }
382     } value-numbering-step
383 ] unit-test
384
385 [
386     {
387         T{ ##peek f 0 D 0 }
388         T{ ##load-integer f 1 100 }
389         T{ ##mul-imm f 2 0 100 }
390     }
391 ] [
392     {
393         T{ ##peek f 0 D 0 }
394         T{ ##load-integer f 1 100 }
395         T{ ##mul f 2 0 1 }
396     } value-numbering-step
397 ] unit-test
398
399 [
400     {
401         T{ ##peek f 0 D 0 }
402         T{ ##load-integer f 1 100 }
403         T{ ##mul-imm f 2 0 100 }
404     }
405 ] [
406     {
407         T{ ##peek f 0 D 0 }
408         T{ ##load-integer f 1 100 }
409         T{ ##mul f 2 1 0 }
410     } value-numbering-step
411 ] unit-test
412
413 [
414     {
415         T{ ##peek f 1 D 0 }
416         T{ ##shl-imm f 2 1 3 }
417     }
418 ] [
419     {
420         T{ ##peek f 1 D 0 }
421         T{ ##mul-imm f 2 1 8 }
422     } value-numbering-step
423 ] unit-test
424
425 [
426     {
427         T{ ##peek f 0 D 0 }
428         T{ ##load-integer f 1 -1 }
429         T{ ##neg f 2 0 }
430     }
431 ] [
432     {
433         T{ ##peek f 0 D 0 }
434         T{ ##load-integer f 1 -1 }
435         T{ ##mul f 2 0 1 }
436     } value-numbering-step
437 ] unit-test
438
439 [
440     {
441         T{ ##peek f 0 D 0 }
442         T{ ##load-integer f 1 -1 }
443         T{ ##neg f 2 0 }
444     }
445 ] [
446     {
447         T{ ##peek f 0 D 0 }
448         T{ ##load-integer f 1 -1 }
449         T{ ##mul f 2 1 0 }
450     } value-numbering-step
451 ] unit-test
452
453 [
454     {
455         T{ ##peek f 0 D 0 }
456         T{ ##load-integer f 1 0 }
457         T{ ##neg f 2 0 }
458     }
459 ] [
460     {
461         T{ ##peek f 0 D 0 }
462         T{ ##load-integer f 1 0 }
463         T{ ##sub f 2 1 0 }
464     } value-numbering-step
465 ] unit-test
466
467 [
468     {
469         T{ ##peek f 0 D 0 }
470         T{ ##load-integer f 1 0 }
471         T{ ##neg f 2 0 }
472         T{ ##copy f 3 0 any-rep }
473     }
474 ] [
475     {
476         T{ ##peek f 0 D 0 }
477         T{ ##load-integer f 1 0 }
478         T{ ##sub f 2 1 0 }
479         T{ ##sub f 3 1 2 }
480     } value-numbering-step
481 ] unit-test
482
483 [
484     {
485         T{ ##peek f 0 D 0 }
486         T{ ##neg f 1 0 }
487         T{ ##copy f 2 0 any-rep }
488     }
489 ] [
490     {
491         T{ ##peek f 0 D 0 }
492         T{ ##neg f 1 0 }
493         T{ ##neg f 2 1 }
494     } value-numbering-step
495 ] unit-test
496
497 [
498     {
499         T{ ##peek f 0 D 0 }
500         T{ ##not f 1 0 }
501         T{ ##copy f 2 0 any-rep }
502     }
503 ] [
504     {
505         T{ ##peek f 0 D 0 }
506         T{ ##not f 1 0 }
507         T{ ##not f 2 1 }
508     } value-numbering-step
509 ] unit-test
510
511 [
512     {
513         T{ ##peek f 0 D 0 }
514         T{ ##load-integer f 1 100 }
515         T{ ##and-imm f 2 0 100 }
516     }
517 ] [
518     {
519         T{ ##peek f 0 D 0 }
520         T{ ##load-integer f 1 100 }
521         T{ ##and f 2 0 1 }
522     } value-numbering-step
523 ] unit-test
524
525 [
526     {
527         T{ ##peek f 0 D 0 }
528         T{ ##load-integer f 1 100 }
529         T{ ##and-imm f 2 0 100 }
530     }
531 ] [
532     {
533         T{ ##peek f 0 D 0 }
534         T{ ##load-integer f 1 100 }
535         T{ ##and f 2 1 0 }
536     } value-numbering-step
537 ] unit-test
538
539 [
540     {
541         T{ ##peek f 0 D 0 }
542         T{ ##load-integer f 1 100 }
543         T{ ##or-imm f 2 0 100 }
544     }
545 ] [
546     {
547         T{ ##peek f 0 D 0 }
548         T{ ##load-integer f 1 100 }
549         T{ ##or f 2 0 1 }
550     } value-numbering-step
551 ] unit-test
552
553 [
554     {
555         T{ ##peek f 0 D 0 }
556         T{ ##load-integer f 1 100 }
557         T{ ##or-imm f 2 0 100 }
558     }
559 ] [
560     {
561         T{ ##peek f 0 D 0 }
562         T{ ##load-integer f 1 100 }
563         T{ ##or f 2 1 0 }
564     } value-numbering-step
565 ] unit-test
566
567 [
568     {
569         T{ ##peek f 0 D 0 }
570         T{ ##load-integer f 1 100 }
571         T{ ##xor-imm f 2 0 100 }
572     }
573 ] [
574     {
575         T{ ##peek f 0 D 0 }
576         T{ ##load-integer f 1 100 }
577         T{ ##xor f 2 0 1 }
578     } value-numbering-step
579 ] unit-test
580
581 [
582     {
583         T{ ##peek f 0 D 0 }
584         T{ ##load-integer f 1 100 }
585         T{ ##xor-imm f 2 0 100 }
586     }
587 ] [
588     {
589         T{ ##peek f 0 D 0 }
590         T{ ##load-integer f 1 100 }
591         T{ ##xor f 2 1 0 }
592     } value-numbering-step
593 ] unit-test
594
595 [
596     {
597         T{ ##peek f 0 D 0 }
598         T{ ##load-integer f 1 100 }
599         T{ ##compare-imm f 2 0 100 cc= }
600     }
601 ] [
602     {
603         T{ ##peek f 0 D 0 }
604         T{ ##load-integer f 1 100 }
605         T{ ##compare f 2 0 1 cc= }
606     } value-numbering-step trim-temps
607 ] unit-test
608
609 [
610     {
611         T{ ##peek f 0 D 0 }
612         T{ ##load-integer f 1 100 }
613         T{ ##compare-integer-imm f 2 0 100 cc<= }
614     }
615 ] [
616     {
617         T{ ##peek f 0 D 0 }
618         T{ ##load-integer f 1 100 }
619         T{ ##compare-integer f 2 0 1 cc<= }
620     } value-numbering-step trim-temps
621 ] unit-test
622
623 cpu x86.32? [
624     [
625         {
626             T{ ##peek f 0 D 0 }
627             T{ ##load-reference f 1 + }
628             T{ ##compare-imm f 2 0 + cc= }
629         }
630     ] [
631         {
632             T{ ##peek f 0 D 0 }
633             T{ ##load-reference f 1 + }
634             T{ ##compare f 2 0 1 cc= }
635         } value-numbering-step trim-temps
636     ] unit-test
637
638     [
639         {
640             T{ ##peek f 0 D 0 }
641             T{ ##load-reference f 1 + }
642             T{ ##compare-imm-branch f 0 + cc= }
643         }
644     ] [
645         {
646             T{ ##peek f 0 D 0 }
647             T{ ##load-reference f 1 + }
648             T{ ##compare-branch f 0 1 cc= }
649         } value-numbering-step trim-temps
650     ] unit-test
651 ] when
652
653 cpu x86.32? [
654     [
655         {
656             T{ ##peek f 0 D 0 }
657             T{ ##load-reference f 1 3.5 }
658             T{ ##compare f 2 0 1 cc= }
659         }
660     ] [
661         {
662             T{ ##peek f 0 D 0 }
663             T{ ##load-reference f 1 3.5 }
664             T{ ##compare f 2 0 1 cc= }
665         } value-numbering-step trim-temps
666     ] unit-test
667
668     [
669         {
670             T{ ##peek f 0 D 0 }
671             T{ ##load-reference f 1 3.5 }
672             T{ ##compare-branch f 0 1 cc= }
673         }
674     ] [
675         {
676             T{ ##peek f 0 D 0 }
677             T{ ##load-reference f 1 3.5 }
678             T{ ##compare-branch f 0 1 cc= }
679         } value-numbering-step trim-temps
680     ] unit-test
681 ] unless
682
683 [
684     {
685         T{ ##peek f 0 D 0 }
686         T{ ##load-integer f 1 100 }
687         T{ ##compare-integer-imm f 2 0 100 cc>= }
688     }
689 ] [
690     {
691         T{ ##peek f 0 D 0 }
692         T{ ##load-integer f 1 100 }
693         T{ ##compare-integer f 2 1 0 cc<= }
694     } value-numbering-step trim-temps
695 ] unit-test
696
697 [
698     {
699         T{ ##peek f 0 D 0 }
700         T{ ##load-integer f 1 100 }
701         T{ ##compare-integer-imm-branch f 0 100 cc<= }
702     }
703 ] [
704     {
705         T{ ##peek f 0 D 0 }
706         T{ ##load-integer f 1 100 }
707         T{ ##compare-integer-branch f 0 1 cc<= }
708     } value-numbering-step
709 ] unit-test
710
711 [
712     {
713         T{ ##peek f 0 D 0 }
714         T{ ##load-integer f 1 100 }
715         T{ ##compare-integer-imm-branch f 0 100 cc>= }
716     }
717 ] [
718     {
719         T{ ##peek f 0 D 0 }
720         T{ ##load-integer f 1 100 }
721         T{ ##compare-integer-branch f 1 0 cc<= }
722     } value-numbering-step trim-temps
723 ] unit-test
724
725 ! Compare folding
726 [
727     {
728         T{ ##load-integer f 1 100 }
729         T{ ##load-integer f 2 200 }
730         T{ ##load-reference f 3 t }
731     }
732 ] [
733     {
734         T{ ##load-integer f 1 100 }
735         T{ ##load-integer f 2 200 }
736         T{ ##compare-integer f 3 1 2 cc<= }
737     } value-numbering-step trim-temps
738 ] unit-test
739
740 [
741     {
742         T{ ##load-integer f 1 100 }
743         T{ ##load-integer f 2 200 }
744         T{ ##load-reference f 3 f }
745     }
746 ] [
747     {
748         T{ ##load-integer f 1 100 }
749         T{ ##load-integer f 2 200 }
750         T{ ##compare-integer f 3 1 2 cc= }
751     } value-numbering-step trim-temps
752 ] unit-test
753
754 [
755     {
756         T{ ##load-integer f 1 100 }
757         T{ ##load-reference f 2 f }
758     }
759 ] [
760     {
761         T{ ##load-integer f 1 100 }
762         T{ ##compare-integer-imm f 2 1 123 cc= }
763     } value-numbering-step trim-temps
764 ] unit-test
765
766 [
767     {
768         T{ ##load-integer f 1 10 }
769         T{ ##load-integer f 2 20 }
770         T{ ##load-reference f 3 f }
771     }
772 ] [
773     {
774         T{ ##load-integer f 1 10 }
775         T{ ##load-integer f 2 20 }
776         T{ ##compare-integer f 3 1 2 cc= }
777     } value-numbering-step
778 ] unit-test
779
780 [
781     {
782         T{ ##load-integer f 1 1 }
783         T{ ##load-integer f 2 2 }
784         T{ ##load-reference f 3 t }
785     }
786 ] [
787     {
788         T{ ##load-integer f 1 1 }
789         T{ ##load-integer f 2 2 }
790         T{ ##compare-integer f 3 1 2 cc/= }
791     } value-numbering-step
792 ] unit-test
793
794 [
795     {
796         T{ ##load-integer f 1 1 }
797         T{ ##load-integer f 2 2 }
798         T{ ##load-reference f 3 t }
799     }
800 ] [
801     {
802         T{ ##load-integer f 1 1 }
803         T{ ##load-integer f 2 2 }
804         T{ ##compare-integer f 3 1 2 cc< }
805     } value-numbering-step
806 ] unit-test
807
808 [
809     {
810         T{ ##load-integer f 1 10 }
811         T{ ##load-integer f 2 20 }
812         T{ ##load-reference f 3 f }
813     }
814 ] [
815     {
816         T{ ##load-integer f 1 10 }
817         T{ ##load-integer f 2 20 }
818         T{ ##compare-integer f 3 2 1 cc< }
819     } value-numbering-step
820 ] unit-test
821
822 [
823     {
824         T{ ##peek f 0 D 0 }
825         T{ ##load-reference f 1 f }
826     }
827 ] [
828     {
829         T{ ##peek f 0 D 0 }
830         T{ ##compare-integer f 1 0 0 cc< }
831     } value-numbering-step
832 ] unit-test
833
834 [
835     {
836         T{ ##peek f 0 D 0 }
837         T{ ##copy f 1 0 any-rep }
838         T{ ##load-reference f 2 f }
839     }
840 ] [
841     {
842         T{ ##peek f 0 D 0 }
843         T{ ##copy f 1 0 any-rep }
844         T{ ##compare-integer f 2 0 1 cc< }
845     } value-numbering-step
846 ] unit-test
847
848 [
849     {
850         T{ ##peek f 0 D 0 }
851         T{ ##load-reference f 1 t }
852     }
853 ] [
854     {
855         T{ ##peek f 0 D 0 }
856         T{ ##compare-integer f 1 0 0 cc<= }
857     } value-numbering-step
858 ] unit-test
859
860 [
861     {
862         T{ ##peek f 0 D 0 }
863         T{ ##load-reference f 1 f }
864     }
865 ] [
866     {
867         T{ ##peek f 0 D 0 }
868         T{ ##compare-integer f 1 0 0 cc> }
869     } value-numbering-step
870 ] unit-test
871
872 [
873     {
874         T{ ##peek f 0 D 0 }
875         T{ ##load-reference f 1 t }
876     }
877 ] [
878     {
879         T{ ##peek f 0 D 0 }
880         T{ ##compare-integer f 1 0 0 cc>= }
881     } value-numbering-step
882 ] unit-test
883
884 [
885     {
886         T{ ##peek f 0 D 0 }
887         T{ ##load-reference f 1 f }
888     }
889 ] [
890     {
891         T{ ##peek f 0 D 0 }
892         T{ ##compare-integer f 1 0 0 cc/= }
893     } value-numbering-step
894 ] unit-test
895
896 [
897     {
898         T{ ##peek f 0 D 0 }
899         T{ ##load-reference f 1 t }
900     }
901 ] [
902     {
903         T{ ##peek f 0 D 0 }
904         T{ ##compare-integer f 1 0 0 cc= }
905     } value-numbering-step
906 ] unit-test
907
908 [
909     {
910         T{ ##load-integer f 1 10 }
911         T{ ##load-reference f 2 t }
912     }
913 ] [
914     {
915         T{ ##load-integer f 1 10 }
916         T{ ##compare-imm f 2 1 10 cc= }
917     } value-numbering-step
918 ] unit-test
919
920 [
921     {
922         T{ ##load-integer f 1 10 }
923         T{ ##load-reference f 2 f }
924     }
925 ] [
926     {
927         T{ ##load-integer f 1 10 }
928         T{ ##compare-imm f 2 1 20 cc= }
929     } value-numbering-step
930 ] unit-test
931
932 [
933     {
934         T{ ##load-integer f 1 10 }
935         T{ ##load-reference f 2 t }
936     }
937 ] [
938     {
939         T{ ##load-integer f 1 10 }
940         T{ ##compare-imm f 2 1 100 cc/= }
941     } value-numbering-step
942 ] unit-test
943
944 [
945     {
946         T{ ##load-integer f 1 10 }
947         T{ ##load-reference f 2 f }
948     }
949 ] [
950     {
951         T{ ##load-integer f 1 10 }
952         T{ ##compare-imm f 2 1 10 cc/= }
953     } value-numbering-step
954 ] unit-test
955
956 cpu x86.32? [
957     [
958         {
959             T{ ##load-reference f 1 + }
960             T{ ##load-reference f 2 f }
961         }
962     ] [
963         {
964             T{ ##load-reference f 1 + }
965             T{ ##compare-imm f 2 1 + cc/= }
966         } value-numbering-step
967     ] unit-test
968
969     [
970         {
971             T{ ##load-reference f 1 + }
972             T{ ##load-reference f 2 t }
973         }
974     ] [
975         {
976             T{ ##load-reference f 1 + }
977             T{ ##compare-imm f 2 1 * cc/= }
978         } value-numbering-step
979     ] unit-test
980
981     [
982         {
983             T{ ##load-reference f 1 + }
984             T{ ##load-reference f 2 t }
985         }
986     ] [
987         {
988             T{ ##load-reference f 1 + }
989             T{ ##compare-imm f 2 1 + cc= }
990         } value-numbering-step
991     ] unit-test
992
993     [
994         {
995             T{ ##load-reference f 1 + }
996             T{ ##load-reference f 2 f }
997         }
998     ] [
999         {
1000             T{ ##load-reference f 1 + }
1001             T{ ##compare-imm f 2 1 * cc= }
1002         } value-numbering-step
1003     ] unit-test
1004 ] when
1005
1006 [
1007     {
1008         T{ ##peek f 0 D 0 }
1009         T{ ##load-reference f 1 t }
1010     }
1011 ] [
1012     {
1013         T{ ##peek f 0 D 0 }
1014         T{ ##compare f 1 0 0 cc= }
1015     } value-numbering-step
1016 ] unit-test
1017
1018 [
1019     {
1020         T{ ##peek f 0 D 0 }
1021         T{ ##load-reference f 1 f }
1022     }
1023 ] [
1024     {
1025         T{ ##peek f 0 D 0 }
1026         T{ ##compare f 1 0 0 cc/= }
1027     } value-numbering-step
1028 ] unit-test
1029
1030 [
1031     {
1032         T{ ##load-integer f 1 12 }
1033         T{ ##load-reference f 3 t }
1034     }
1035 ] [
1036     {
1037         T{ ##load-integer f 1 12 }
1038         T{ ##test-imm f 3 1 13 cc/= }
1039     } value-numbering-step
1040 ] unit-test
1041
1042 [
1043     {
1044         T{ ##load-integer f 1 15 }
1045         T{ ##load-reference f 3 f }
1046     }
1047 ] [
1048     {
1049         T{ ##load-integer f 1 15 }
1050         T{ ##test-imm f 3 1 16 cc/= }
1051     } value-numbering-step
1052 ] unit-test
1053
1054 [
1055     {
1056         T{ ##load-integer f 1 12 }
1057         T{ ##load-reference f 3 f }
1058     }
1059 ] [
1060     {
1061         T{ ##load-integer f 1 12 }
1062         T{ ##test-imm f 3 1 13 cc= }
1063     } value-numbering-step
1064 ] unit-test
1065
1066 [
1067     {
1068         T{ ##load-integer f 1 15 }
1069         T{ ##load-reference f 3 t }
1070     }
1071 ] [
1072     {
1073         T{ ##load-integer f 1 15 }
1074         T{ ##test-imm f 3 1 16 cc= }
1075     } value-numbering-step
1076 ] unit-test
1077
1078 ! Rewriting a ##test of an ##and into a ##test
1079 [
1080     {
1081         T{ ##peek f 0 D 0 }
1082         T{ ##peek f 1 D 1 }
1083         T{ ##and f 2 0 1 }
1084         T{ ##test f 3 0 1 cc= }
1085     }
1086 ] [
1087     {
1088         T{ ##peek f 0 D 0 }
1089         T{ ##peek f 1 D 1 }
1090         T{ ##and f 2 0 1 }
1091         T{ ##test f 3 2 2 cc= }
1092     } value-numbering-step
1093 ] unit-test
1094
1095 [
1096     {
1097         T{ ##peek f 0 D 0 }
1098         T{ ##and-imm f 2 0 12 }
1099         T{ ##test-imm f 3 0 12 cc= }
1100     }
1101 ] [
1102     {
1103         T{ ##peek f 0 D 0 }
1104         T{ ##and-imm f 2 0 12 }
1105         T{ ##test f 3 2 2 cc= }
1106     } value-numbering-step
1107 ] unit-test
1108
1109 ! Rewriting ##test into ##test-imm
1110 [
1111     {
1112         T{ ##peek f 0 D 0 }
1113         T{ ##load-integer f 1 10 }
1114         T{ ##test-imm f 2 0 10 cc= }
1115     }
1116 ] [
1117     {
1118         T{ ##peek f 0 D 0 }
1119         T{ ##load-integer f 1 10 }
1120         T{ ##test f 2 0 1 cc= }
1121     } value-numbering-step trim-temps
1122 ] unit-test
1123
1124 [
1125     {
1126         T{ ##peek f 0 D 0 }
1127         T{ ##load-integer f 1 10 }
1128         T{ ##test-imm f 2 0 10 cc= }
1129     }
1130 ] [
1131     {
1132         T{ ##peek f 0 D 0 }
1133         T{ ##load-integer f 1 10 }
1134         T{ ##test f 2 1 0 cc= }
1135     } value-numbering-step trim-temps
1136 ] unit-test
1137
1138 [
1139     {
1140         T{ ##peek f 0 D 0 }
1141         T{ ##load-integer f 1 10 }
1142         T{ ##test-imm-branch f 0 10 cc= }
1143     }
1144 ] [
1145     {
1146         T{ ##peek f 0 D 0 }
1147         T{ ##load-integer f 1 10 }
1148         T{ ##test-branch f 0 1 cc= }
1149     } value-numbering-step
1150 ] unit-test
1151
1152 [
1153     {
1154         T{ ##peek f 0 D 0 }
1155         T{ ##load-integer f 1 10 }
1156         T{ ##test-imm-branch f 0 10 cc= }
1157     }
1158 ] [
1159     {
1160         T{ ##peek f 0 D 0 }
1161         T{ ##load-integer f 1 10 }
1162         T{ ##test-branch f 1 0 cc= }
1163     } value-numbering-step
1164 ] unit-test
1165
1166 [
1167     {
1168         T{ ##peek f 0 D 0 }
1169         T{ ##load-integer f 1 10 }
1170         T{ ##test-imm-branch f 0 10 cc= }
1171     }
1172 ] [
1173     {
1174         T{ ##peek f 0 D 0 }
1175         T{ ##load-integer f 1 10 }
1176         T{ ##test-branch f 1 0 cc= }
1177     } value-numbering-step
1178 ] unit-test
1179
1180 ! Make sure the immediate fits
1181 cpu x86.64? [
1182     [
1183         {
1184             T{ ##peek f 0 D 0 }
1185             T{ ##load-integer f 1 100000000000 }
1186             T{ ##test f 2 1 0 cc= }
1187         }
1188     ] [
1189         {
1190             T{ ##peek f 0 D 0 }
1191             T{ ##load-integer f 1 100000000000 }
1192             T{ ##test f 2 1 0 cc= }
1193         } value-numbering-step
1194     ] unit-test
1195
1196     [
1197         {
1198             T{ ##peek f 0 D 0 }
1199             T{ ##load-integer f 1 100000000000 }
1200             T{ ##test-branch f 1 0 cc= }
1201         }
1202     ] [
1203         {
1204             T{ ##peek f 0 D 0 }
1205             T{ ##load-integer f 1 100000000000 }
1206             T{ ##test-branch f 1 0 cc= }
1207         } value-numbering-step
1208     ] unit-test
1209 ] when
1210
1211 ! Rewriting ##compare into ##test
1212 cpu x86? [
1213     [
1214         {
1215             T{ ##peek f 0 D 0 }
1216             T{ ##test f 1 0 0 cc= }
1217         }
1218     ] [
1219         {
1220             T{ ##peek f 0 D 0 }
1221             T{ ##compare-integer-imm f 1 0 0 cc= }
1222         } value-numbering-step
1223     ] unit-test
1224
1225     [
1226         {
1227             T{ ##peek f 0 D 0 }
1228             T{ ##test f 1 0 0 cc/= }
1229         }
1230     ] [
1231         {
1232             T{ ##peek f 0 D 0 }
1233             T{ ##compare-integer-imm f 1 0 0 cc/= }
1234         } value-numbering-step
1235     ] unit-test
1236
1237     [
1238         {
1239             T{ ##peek f 0 D 0 }
1240             T{ ##compare-integer-imm f 1 0 0 cc<= }
1241         }
1242     ] [
1243         {
1244             T{ ##peek f 0 D 0 }
1245             T{ ##compare-integer-imm f 1 0 0 cc<= }
1246         } value-numbering-step
1247     ] unit-test
1248     
1249     [
1250         {
1251             T{ ##peek f 0 D 0 }
1252             T{ ##test-branch f 0 0 cc= }
1253         }
1254     ] [
1255         {
1256             T{ ##peek f 0 D 0 }
1257             T{ ##compare-integer-imm-branch f 0 0 cc= }
1258         } value-numbering-step
1259     ] unit-test
1260
1261     [
1262         {
1263             T{ ##peek f 0 D 0 }
1264             T{ ##test-branch f 0 0 cc/= }
1265         }
1266     ] [
1267         {
1268             T{ ##peek f 0 D 0 }
1269             T{ ##compare-integer-imm-branch f 0 0 cc/= }
1270         } value-numbering-step
1271     ] unit-test
1272
1273     [
1274         {
1275             T{ ##peek f 0 D 0 }
1276             T{ ##compare-integer-imm-branch f 0 0 cc<= }
1277         }
1278     ] [
1279         {
1280             T{ ##peek f 0 D 0 }
1281             T{ ##compare-integer-imm-branch f 0 0 cc<= }
1282         } value-numbering-step
1283     ] unit-test
1284 ] when
1285
1286 ! Reassociation
1287 [
1288     {
1289         T{ ##peek f 0 D 0 }
1290         T{ ##load-integer f 1 100 }
1291         T{ ##add-imm f 2 0 100 }
1292         T{ ##load-integer f 3 50 }
1293         T{ ##add-imm f 4 0 150 }
1294     }
1295 ] [
1296     {
1297         T{ ##peek f 0 D 0 }
1298         T{ ##load-integer f 1 100 }
1299         T{ ##add f 2 0 1 }
1300         T{ ##load-integer f 3 50 }
1301         T{ ##add f 4 2 3 }
1302     } value-numbering-step
1303 ] unit-test
1304
1305 [
1306     {
1307         T{ ##peek f 0 D 0 }
1308         T{ ##load-integer f 1 100 }
1309         T{ ##add-imm f 2 0 100 }
1310         T{ ##load-integer f 3 50 }
1311         T{ ##add-imm f 4 0 150 }
1312     }
1313 ] [
1314     {
1315         T{ ##peek f 0 D 0 }
1316         T{ ##load-integer f 1 100 }
1317         T{ ##add f 2 1 0 }
1318         T{ ##load-integer f 3 50 }
1319         T{ ##add f 4 3 2 }
1320     } value-numbering-step
1321 ] unit-test
1322
1323 [
1324     {
1325         T{ ##peek f 0 D 0 }
1326         T{ ##load-integer f 1 100 }
1327         T{ ##add-imm f 2 0 100 }
1328         T{ ##load-integer f 3 50 }
1329         T{ ##add-imm f 4 0 50 }
1330     }
1331 ] [
1332     {
1333         T{ ##peek f 0 D 0 }
1334         T{ ##load-integer f 1 100 }
1335         T{ ##add f 2 0 1 }
1336         T{ ##load-integer f 3 50 }
1337         T{ ##sub f 4 2 3 }
1338     } value-numbering-step
1339 ] unit-test
1340
1341 [
1342     {
1343         T{ ##peek f 0 D 0 }
1344         T{ ##load-integer f 1 100 }
1345         T{ ##add-imm f 2 0 -100 }
1346         T{ ##load-integer f 3 50 }
1347         T{ ##add-imm f 4 0 -150 }
1348     }
1349 ] [
1350     {
1351         T{ ##peek f 0 D 0 }
1352         T{ ##load-integer f 1 100 }
1353         T{ ##sub f 2 0 1 }
1354         T{ ##load-integer f 3 50 }
1355         T{ ##sub f 4 2 3 }
1356     } value-numbering-step
1357 ] unit-test
1358
1359 [
1360     {
1361         T{ ##peek f 0 D 0 }
1362         T{ ##load-integer f 1 100 }
1363         T{ ##mul-imm f 2 0 100 }
1364         T{ ##load-integer f 3 50 }
1365         T{ ##mul-imm f 4 0 5000 }
1366     }
1367 ] [
1368     {
1369         T{ ##peek f 0 D 0 }
1370         T{ ##load-integer f 1 100 }
1371         T{ ##mul f 2 0 1 }
1372         T{ ##load-integer f 3 50 }
1373         T{ ##mul f 4 2 3 }
1374     } value-numbering-step
1375 ] unit-test
1376
1377 [
1378     {
1379         T{ ##peek f 0 D 0 }
1380         T{ ##load-integer f 1 100 }
1381         T{ ##mul-imm f 2 0 100 }
1382         T{ ##load-integer f 3 50 }
1383         T{ ##mul-imm f 4 0 5000 }
1384     }
1385 ] [
1386     {
1387         T{ ##peek f 0 D 0 }
1388         T{ ##load-integer f 1 100 }
1389         T{ ##mul f 2 1 0 }
1390         T{ ##load-integer f 3 50 }
1391         T{ ##mul f 4 3 2 }
1392     } value-numbering-step
1393 ] unit-test
1394
1395 [
1396     {
1397         T{ ##peek f 0 D 0 }
1398         T{ ##load-integer f 1 100 }
1399         T{ ##and-imm f 2 0 100 }
1400         T{ ##load-integer f 3 50 }
1401         T{ ##and-imm f 4 0 32 }
1402     }
1403 ] [
1404     {
1405         T{ ##peek f 0 D 0 }
1406         T{ ##load-integer f 1 100 }
1407         T{ ##and f 2 0 1 }
1408         T{ ##load-integer f 3 50 }
1409         T{ ##and f 4 2 3 }
1410     } value-numbering-step
1411 ] unit-test
1412
1413 [
1414     {
1415         T{ ##peek f 0 D 0 }
1416         T{ ##load-integer f 1 100 }
1417         T{ ##and-imm f 2 0 100 }
1418         T{ ##load-integer f 3 50 }
1419         T{ ##and-imm f 4 0 32 }
1420     }
1421 ] [
1422     {
1423         T{ ##peek f 0 D 0 }
1424         T{ ##load-integer f 1 100 }
1425         T{ ##and f 2 1 0 }
1426         T{ ##load-integer f 3 50 }
1427         T{ ##and f 4 3 2 }
1428     } value-numbering-step
1429 ] unit-test
1430
1431 [
1432     {
1433         T{ ##peek f 0 D 0 }
1434         T{ ##load-integer f 1 100 }
1435         T{ ##or-imm f 2 0 100 }
1436         T{ ##load-integer f 3 50 }
1437         T{ ##or-imm f 4 0 118 }
1438     }
1439 ] [
1440     {
1441         T{ ##peek f 0 D 0 }
1442         T{ ##load-integer f 1 100 }
1443         T{ ##or f 2 0 1 }
1444         T{ ##load-integer f 3 50 }
1445         T{ ##or f 4 2 3 }
1446     } value-numbering-step
1447 ] unit-test
1448
1449 [
1450     {
1451         T{ ##peek f 0 D 0 }
1452         T{ ##load-integer f 1 100 }
1453         T{ ##or-imm f 2 0 100 }
1454         T{ ##load-integer f 3 50 }
1455         T{ ##or-imm f 4 0 118 }
1456     }
1457 ] [
1458     {
1459         T{ ##peek f 0 D 0 }
1460         T{ ##load-integer f 1 100 }
1461         T{ ##or f 2 1 0 }
1462         T{ ##load-integer f 3 50 }
1463         T{ ##or f 4 3 2 }
1464     } value-numbering-step
1465 ] unit-test
1466
1467 [
1468     {
1469         T{ ##peek f 0 D 0 }
1470         T{ ##load-integer f 1 100 }
1471         T{ ##xor-imm f 2 0 100 }
1472         T{ ##load-integer f 3 50 }
1473         T{ ##xor-imm f 4 0 86 }
1474     }
1475 ] [
1476     {
1477         T{ ##peek f 0 D 0 }
1478         T{ ##load-integer f 1 100 }
1479         T{ ##xor f 2 0 1 }
1480         T{ ##load-integer f 3 50 }
1481         T{ ##xor f 4 2 3 }
1482     } value-numbering-step
1483 ] unit-test
1484
1485 [
1486     {
1487         T{ ##peek f 0 D 0 }
1488         T{ ##load-integer f 1 100 }
1489         T{ ##xor-imm f 2 0 100 }
1490         T{ ##load-integer f 3 50 }
1491         T{ ##xor-imm f 4 0 86 }
1492     }
1493 ] [
1494     {
1495         T{ ##peek f 0 D 0 }
1496         T{ ##load-integer f 1 100 }
1497         T{ ##xor f 2 1 0 }
1498         T{ ##load-integer f 3 50 }
1499         T{ ##xor f 4 3 2 }
1500     } value-numbering-step
1501 ] unit-test
1502
1503 [
1504     {
1505         T{ ##peek f 0 D 0 }
1506         T{ ##shl-imm f 1 0 10 }
1507         T{ ##shl-imm f 2 0 21 }
1508         T{ ##replace f 2 D 0 }
1509     }
1510 ] [
1511     {
1512         T{ ##peek f 0 D 0 }
1513         T{ ##shl-imm f 1 0 10 }
1514         T{ ##shl-imm f 2 1 11 }
1515         T{ ##replace f 2 D 0 }
1516     } value-numbering-step
1517 ] unit-test
1518
1519 [
1520     {
1521         T{ ##peek f 0 D 0 }
1522         T{ ##shl-imm f 1 0 10 }
1523         T{ ##shl-imm f 2 1 $[ cell-bits 1 - ] }
1524         T{ ##replace f 2 D 0 }
1525     }
1526 ] [
1527     {
1528         T{ ##peek f 0 D 0 }
1529         T{ ##shl-imm f 1 0 10 }
1530         T{ ##shl-imm f 2 1 $[ cell-bits 1 - ] }
1531         T{ ##replace f 2 D 0 }
1532     } value-numbering-step
1533 ] unit-test
1534
1535 [
1536     {
1537         T{ ##peek f 0 D 0 }
1538         T{ ##sar-imm f 1 0 10 }
1539         T{ ##sar-imm f 2 0 21 }
1540         T{ ##replace f 2 D 0 }
1541     }
1542 ] [
1543     {
1544         T{ ##peek f 0 D 0 }
1545         T{ ##sar-imm f 1 0 10 }
1546         T{ ##sar-imm f 2 1 11 }
1547         T{ ##replace f 2 D 0 }
1548     } value-numbering-step
1549 ] unit-test
1550
1551 [
1552     {
1553         T{ ##peek f 0 D 0 }
1554         T{ ##sar-imm f 1 0 10 }
1555         T{ ##sar-imm f 2 1 $[ cell-bits 1 - ] }
1556         T{ ##replace f 2 D 0 }
1557     }
1558 ] [
1559     {
1560         T{ ##peek f 0 D 0 }
1561         T{ ##sar-imm f 1 0 10 }
1562         T{ ##sar-imm f 2 1 $[ cell-bits 1 - ] }
1563         T{ ##replace f 2 D 0 }
1564     } value-numbering-step
1565 ] unit-test
1566
1567 [
1568     {
1569         T{ ##peek f 0 D 0 }
1570         T{ ##shr-imm f 1 0 10 }
1571         T{ ##shr-imm f 2 0 21 }
1572         T{ ##replace f 2 D 0 }
1573     }
1574 ] [
1575     {
1576         T{ ##peek f 0 D 0 }
1577         T{ ##shr-imm f 1 0 10 }
1578         T{ ##shr-imm f 2 1 11 }
1579         T{ ##replace f 2 D 0 }
1580     } value-numbering-step
1581 ] unit-test
1582
1583 [
1584     {
1585         T{ ##peek f 0 D 0 }
1586         T{ ##shr-imm f 1 0 10 }
1587         T{ ##shr-imm f 2 1 $[ cell-bits 1 - ] }
1588         T{ ##replace f 2 D 0 }
1589     }
1590 ] [
1591     {
1592         T{ ##peek f 0 D 0 }
1593         T{ ##shr-imm f 1 0 10 }
1594         T{ ##shr-imm f 2 1 $[ cell-bits 1 - ] }
1595         T{ ##replace f 2 D 0 }
1596     } value-numbering-step
1597 ] unit-test
1598
1599 [
1600     {
1601         T{ ##peek f 0 D 0 }
1602         T{ ##shr-imm f 1 0 10 }
1603         T{ ##sar-imm f 2 1 11 }
1604         T{ ##replace f 2 D 0 }
1605     }
1606 ] [
1607     {
1608         T{ ##peek f 0 D 0 }
1609         T{ ##shr-imm f 1 0 10 }
1610         T{ ##sar-imm f 2 1 11 }
1611         T{ ##replace f 2 D 0 }
1612     } value-numbering-step
1613 ] unit-test
1614
1615 ! Distributive law
1616 2 \ vreg-counter set-global
1617
1618 [
1619     {
1620         T{ ##peek f 0 D 0 }
1621         T{ ##add-imm f 1 0 10 }
1622         T{ ##shl-imm f 3 0 2 }
1623         T{ ##add-imm f 2 3 40 }
1624         T{ ##replace f 2 D 0 }
1625     }
1626 ] [
1627     {
1628         T{ ##peek f 0 D 0 }
1629         T{ ##add-imm f 1 0 10 }
1630         T{ ##shl-imm f 2 1 2 }
1631         T{ ##replace f 2 D 0 }
1632     } value-numbering-step
1633 ] unit-test
1634
1635 [
1636     {
1637         T{ ##peek f 0 D 0 }
1638         T{ ##add-imm f 1 0 10 }
1639         T{ ##mul-imm f 4 0 3 }
1640         T{ ##add-imm f 2 4 30 }
1641         T{ ##replace f 2 D 0 }
1642     }
1643 ] [
1644     {
1645         T{ ##peek f 0 D 0 }
1646         T{ ##add-imm f 1 0 10 }
1647         T{ ##mul-imm f 2 1 3 }
1648         T{ ##replace f 2 D 0 }
1649     } value-numbering-step
1650 ] unit-test
1651
1652 [
1653     {
1654         T{ ##peek f 0 D 0 }
1655         T{ ##add-imm f 1 0 -10 }
1656         T{ ##shl-imm f 5 0 2 }
1657         T{ ##add-imm f 2 5 -40 }
1658         T{ ##replace f 2 D 0 }
1659     }
1660 ] [
1661     {
1662         T{ ##peek f 0 D 0 }
1663         T{ ##sub-imm f 1 0 10 }
1664         T{ ##shl-imm f 2 1 2 }
1665         T{ ##replace f 2 D 0 }
1666     } value-numbering-step
1667 ] unit-test
1668
1669 [
1670     {
1671         T{ ##peek f 0 D 0 }
1672         T{ ##add-imm f 1 0 -10 }
1673         T{ ##mul-imm f 6 0 3 }
1674         T{ ##add-imm f 2 6 -30 }
1675         T{ ##replace f 2 D 0 }
1676     }
1677 ] [
1678     {
1679         T{ ##peek f 0 D 0 }
1680         T{ ##sub-imm f 1 0 10 }
1681         T{ ##mul-imm f 2 1 3 }
1682         T{ ##replace f 2 D 0 }
1683     } value-numbering-step
1684 ] unit-test
1685
1686 ! Simplification
1687 [
1688     {
1689         T{ ##peek f 0 D 0 }
1690         T{ ##peek f 1 D 1 }
1691         T{ ##copy f 3 0 any-rep }
1692         T{ ##replace f 3 D 0 }
1693     }
1694 ] [
1695     {
1696         T{ ##peek f 0 D 0 }
1697         T{ ##peek f 1 D 1 }
1698         T{ ##add-imm f 3 0 0 }
1699         T{ ##replace f 3 D 0 }
1700     } value-numbering-step
1701 ] unit-test
1702
1703 [
1704     {
1705         T{ ##peek f 0 D 0 }
1706         T{ ##peek f 1 D 1 }
1707         T{ ##copy f 3 0 any-rep }
1708         T{ ##replace f 3 D 0 }
1709     }
1710 ] [
1711     {
1712         T{ ##peek f 0 D 0 }
1713         T{ ##peek f 1 D 1 }
1714         T{ ##or-imm f 3 0 0 }
1715         T{ ##replace f 3 D 0 }
1716     } value-numbering-step
1717 ] unit-test
1718
1719 [
1720     {
1721         T{ ##peek f 0 D 0 }
1722         T{ ##peek f 1 D 1 }
1723         T{ ##copy f 3 0 any-rep }
1724         T{ ##replace f 3 D 0 }
1725     }
1726 ] [
1727     {
1728         T{ ##peek f 0 D 0 }
1729         T{ ##peek f 1 D 1 }
1730         T{ ##xor-imm f 3 0 0 }
1731         T{ ##replace f 3 D 0 }
1732     } value-numbering-step
1733 ] unit-test
1734
1735 [
1736     {
1737         T{ ##peek f 0 D 0 }
1738         T{ ##load-integer f 1 0 }
1739     }
1740 ] [
1741     {
1742         T{ ##peek f 0 D 0 }
1743         T{ ##and-imm f 1 0 0 }
1744     } value-numbering-step
1745 ] unit-test
1746
1747 [
1748     {
1749         T{ ##peek f 0 D 0 }
1750         T{ ##copy f 1 0 any-rep }
1751         T{ ##replace f 1 D 0 }
1752     }
1753 ] [
1754     {
1755         T{ ##peek f 0 D 0 }
1756         T{ ##and-imm f 1 0 -1 }
1757         T{ ##replace f 1 D 0 }
1758     } value-numbering-step
1759 ] unit-test
1760
1761 [
1762     {
1763         T{ ##peek f 0 D 0 }
1764         T{ ##copy f 1 0 any-rep }
1765         T{ ##replace f 1 D 0 }
1766     }
1767 ] [
1768     {
1769         T{ ##peek f 0 D 0 }
1770         T{ ##and f 1 0 0 }
1771         T{ ##replace f 1 D 0 }
1772     } value-numbering-step
1773 ] unit-test
1774
1775 [
1776     {
1777         T{ ##peek f 0 D 0 }
1778         T{ ##copy f 1 0 any-rep }
1779         T{ ##replace f 1 D 0 }
1780     }
1781 ] [
1782     {
1783         T{ ##peek f 0 D 0 }
1784         T{ ##or-imm f 1 0 0 }
1785         T{ ##replace f 1 D 0 }
1786     } value-numbering-step
1787 ] unit-test
1788
1789 [
1790     {
1791         T{ ##peek f 0 D 0 }
1792         T{ ##load-integer f 1 -1 }
1793     }
1794 ] [
1795     {
1796         T{ ##peek f 0 D 0 }
1797         T{ ##or-imm f 1 0 -1 }
1798     } value-numbering-step
1799 ] unit-test
1800
1801 [
1802     {
1803         T{ ##peek f 0 D 0 }
1804         T{ ##copy f 1 0 any-rep }
1805         T{ ##replace f 1 D 0 }
1806     }
1807 ] [
1808     {
1809         T{ ##peek f 0 D 0 }
1810         T{ ##or f 1 0 0 }
1811         T{ ##replace f 1 D 0 }
1812     } value-numbering-step
1813 ] unit-test
1814
1815 [
1816     {
1817         T{ ##peek f 0 D 0 }
1818         T{ ##copy f 1 0 any-rep }
1819         T{ ##replace f 1 D 0 }
1820     }
1821 ] [
1822     {
1823         T{ ##peek f 0 D 0 }
1824         T{ ##xor-imm f 1 0 0 }
1825         T{ ##replace f 1 D 0 }
1826     } value-numbering-step
1827 ] unit-test
1828
1829 [
1830     {
1831         T{ ##peek f 0 D 0 }
1832         T{ ##not f 1 0 }
1833         T{ ##replace f 1 D 0 }
1834     }
1835 ] [
1836     {
1837         T{ ##peek f 0 D 0 }
1838         T{ ##xor-imm f 1 0 -1 }
1839         T{ ##replace f 1 D 0 }
1840     } value-numbering-step
1841 ] unit-test
1842
1843 [
1844     {
1845         T{ ##peek f 0 D 0 }
1846         T{ ##load-integer f 1 0 }
1847     }
1848 ] [
1849     {
1850         T{ ##peek f 0 D 0 }
1851         T{ ##xor f 1 0 0 }
1852     } value-numbering-step
1853 ] unit-test
1854
1855 [
1856     {
1857         T{ ##peek f 0 D 0 }
1858         T{ ##copy f 2 0 any-rep }
1859         T{ ##replace f 2 D 0 }
1860     }
1861 ] [
1862     {
1863         T{ ##peek f 0 D 0 }
1864         T{ ##mul-imm f 2 0 1 }
1865         T{ ##replace f 2 D 0 }
1866     } value-numbering-step
1867 ] unit-test
1868
1869 [
1870     {
1871         T{ ##peek f 0 D 0 }
1872         T{ ##copy f 2 0 any-rep }
1873         T{ ##replace f 2 D 0 }
1874     }
1875 ] [
1876     {
1877         T{ ##peek f 0 D 0 }
1878         T{ ##shl-imm f 2 0 0 }
1879         T{ ##replace f 2 D 0 }
1880     } value-numbering-step
1881 ] unit-test
1882
1883 [
1884     {
1885         T{ ##peek f 0 D 0 }
1886         T{ ##copy f 2 0 any-rep }
1887         T{ ##replace f 2 D 0 }
1888     }
1889 ] [
1890     {
1891         T{ ##peek f 0 D 0 }
1892         T{ ##shr-imm f 2 0 0 }
1893         T{ ##replace f 2 D 0 }
1894     } value-numbering-step
1895 ] unit-test
1896
1897 [
1898     {
1899         T{ ##peek f 0 D 0 }
1900         T{ ##copy f 2 0 any-rep }
1901         T{ ##replace f 2 D 0 }
1902     }
1903 ] [
1904     {
1905         T{ ##peek f 0 D 0 }
1906         T{ ##sar-imm f 2 0 0 }
1907         T{ ##replace f 2 D 0 }
1908     } value-numbering-step
1909 ] unit-test
1910
1911 ! Constant folding
1912 [
1913     {
1914         T{ ##peek f 0 D 0 }
1915         T{ ##load-integer f 1 1 }
1916         T{ ##load-integer f 2 3 }
1917         T{ ##load-integer f 3 4 }
1918     }
1919 ] [
1920     {
1921         T{ ##peek f 0 D 0 }
1922         T{ ##load-integer f 1 1 }
1923         T{ ##load-integer f 2 3 }
1924         T{ ##add f 3 1 2 }
1925     } value-numbering-step
1926 ] unit-test
1927
1928 [
1929     {
1930         T{ ##peek f 0 D 0 }
1931         T{ ##load-integer f 1 1 }
1932         T{ ##load-integer f 2 3 }
1933         T{ ##load-integer f 3 -2 }
1934     }
1935 ] [
1936     {
1937         T{ ##peek f 0 D 0 }
1938         T{ ##load-integer f 1 1 }
1939         T{ ##load-integer f 2 3 }
1940         T{ ##sub f 3 1 2 }
1941     } value-numbering-step
1942 ] unit-test
1943
1944 [
1945     {
1946         T{ ##peek f 0 D 0 }
1947         T{ ##load-integer f 1 2 }
1948         T{ ##load-integer f 2 3 }
1949         T{ ##load-integer f 3 6 }
1950     }
1951 ] [
1952     {
1953         T{ ##peek f 0 D 0 }
1954         T{ ##load-integer f 1 2 }
1955         T{ ##load-integer f 2 3 }
1956         T{ ##mul f 3 1 2 }
1957     } value-numbering-step
1958 ] unit-test
1959
1960 [
1961     {
1962         T{ ##peek f 0 D 0 }
1963         T{ ##load-integer f 1 2 }
1964         T{ ##load-integer f 2 1 }
1965         T{ ##load-integer f 3 0 }
1966     }
1967 ] [
1968     {
1969         T{ ##peek f 0 D 0 }
1970         T{ ##load-integer f 1 2 }
1971         T{ ##load-integer f 2 1 }
1972         T{ ##and f 3 1 2 }
1973     } value-numbering-step
1974 ] unit-test
1975
1976 [
1977     {
1978         T{ ##peek f 0 D 0 }
1979         T{ ##load-integer f 1 2 }
1980         T{ ##load-integer f 2 1 }
1981         T{ ##load-integer f 3 3 }
1982     }
1983 ] [
1984     {
1985         T{ ##peek f 0 D 0 }
1986         T{ ##load-integer f 1 2 }
1987         T{ ##load-integer f 2 1 }
1988         T{ ##or f 3 1 2 }
1989     } value-numbering-step
1990 ] unit-test
1991
1992 [
1993     {
1994         T{ ##peek f 0 D 0 }
1995         T{ ##load-integer f 1 2 }
1996         T{ ##load-integer f 2 3 }
1997         T{ ##load-integer f 3 1 }
1998     }
1999 ] [
2000     {
2001         T{ ##peek f 0 D 0 }
2002         T{ ##load-integer f 1 2 }
2003         T{ ##load-integer f 2 3 }
2004         T{ ##xor f 3 1 2 }
2005     } value-numbering-step
2006 ] unit-test
2007
2008 [
2009     {
2010         T{ ##peek f 0 D 0 }
2011         T{ ##load-integer f 1 1 }
2012         T{ ##load-integer f 3 8 }
2013     }
2014 ] [
2015     {
2016         T{ ##peek f 0 D 0 }
2017         T{ ##load-integer f 1 1 }
2018         T{ ##shl-imm f 3 1 3 }
2019     } value-numbering-step
2020 ] unit-test
2021
2022 cell 8 = [
2023     [
2024         {
2025             T{ ##peek f 0 D 0 }
2026             T{ ##load-integer f 1 -1 }
2027             T{ ##load-integer f 3 0xffffffffffff }
2028         }
2029     ] [
2030         {
2031             T{ ##peek f 0 D 0 }
2032             T{ ##load-integer f 1 -1 }
2033             T{ ##shr-imm f 3 1 16 }
2034         } value-numbering-step
2035     ] unit-test
2036 ] when
2037
2038 [
2039     {
2040         T{ ##peek f 0 D 0 }
2041         T{ ##load-integer f 1 -8 }
2042         T{ ##load-integer f 3 -4 }
2043     }
2044 ] [
2045     {
2046         T{ ##peek f 0 D 0 }
2047         T{ ##load-integer f 1 -8 }
2048         T{ ##sar-imm f 3 1 1 }
2049     } value-numbering-step
2050 ] unit-test
2051
2052 cell 8 = [
2053     [
2054         {
2055             T{ ##peek f 0 D 0 }
2056             T{ ##load-integer f 1 65536 }
2057             T{ ##load-integer f 2 140737488355328 }
2058             T{ ##add f 3 0 2 }
2059         }
2060     ] [
2061         {
2062             T{ ##peek f 0 D 0 }
2063             T{ ##load-integer f 1 65536 }
2064             T{ ##shl-imm f 2 1 31 }
2065             T{ ##add f 3 0 2 }
2066         } value-numbering-step
2067     ] unit-test
2068
2069     [
2070         {
2071             T{ ##peek f 0 D 0 }
2072             T{ ##load-integer f 2 140737488355328 }
2073             T{ ##add f 3 0 2 }
2074         }
2075     ] [
2076         {
2077             T{ ##peek f 0 D 0 }
2078             T{ ##load-integer f 2 140737488355328 }
2079             T{ ##add f 3 0 2 }
2080         } value-numbering-step
2081     ] unit-test
2082
2083     ! PPC ADDI can't hold immediates this big.
2084     cpu ppc? [
2085         [
2086             {
2087                 T{ ##peek f 0 D 0 }
2088                 T{ ##load-integer f 2 2147483647 }
2089                 T{ ##add-imm f 3 0 2147483647 }
2090                 T{ ##add-imm f 4 3 2147483647 }
2091             }
2092         ] [
2093             {
2094                 T{ ##peek f 0 D 0 }
2095                 T{ ##load-integer f 2 2147483647 }
2096                 T{ ##add f 3 0 2 }
2097                 T{ ##add f 4 3 2 }
2098             } value-numbering-step
2099         ] unit-test
2100     ] unless
2101 ] when
2102
2103 [
2104     {
2105         T{ ##peek f 0 D 0 }
2106         T{ ##load-integer f 1 1 }
2107         T{ ##load-integer f 2 -1 }
2108     }
2109 ] [
2110     {
2111         T{ ##peek f 0 D 0 }
2112         T{ ##load-integer f 1 1 }
2113         T{ ##neg f 2 1 }
2114     } value-numbering-step
2115 ] unit-test
2116
2117 [
2118     {
2119         T{ ##peek f 0 D 0 }
2120         T{ ##load-integer f 1 1 }
2121         T{ ##load-integer f 2 -2 }
2122     }
2123 ] [
2124     {
2125         T{ ##peek f 0 D 0 }
2126         T{ ##load-integer f 1 1 }
2127         T{ ##not f 2 1 }
2128     } value-numbering-step
2129 ] unit-test
2130
2131 ! ##tagged>integer constant folding
2132 [
2133     {
2134         T{ ##load-reference f 1 f }
2135         T{ ##load-integer f 2 $[ \ f type-number ] }
2136         T{ ##copy f 3 2 any-rep }
2137     }
2138 ] [
2139     {
2140         T{ ##load-reference f 1 f }
2141         T{ ##tagged>integer f 2 1 }
2142         T{ ##and-imm f 3 2 15 }
2143     } value-numbering-step
2144 ] unit-test
2145
2146 [
2147     {
2148         T{ ##load-integer f 1 100 }
2149         T{ ##load-integer f 2 $[ 100 tag-fixnum ] }
2150         T{ ##load-integer f 3 $[ 100 tag-fixnum 1 + ] }
2151     }
2152 ] [
2153     {
2154         T{ ##load-integer f 1 100 }
2155         T{ ##tagged>integer f 2 1 }
2156         T{ ##add-imm f 3 2 1 }
2157     } value-numbering-step
2158 ] unit-test
2159
2160 ! Alien boxing and unboxing
2161 [
2162     {
2163         T{ ##peek f 0 D 0 }
2164         T{ ##box-alien f 1 0 }
2165         T{ ##copy f 2 0 any-rep }
2166         T{ ##replace f 2 D 0 }
2167     }
2168 ] [
2169     {
2170         T{ ##peek f 0 D 0 }
2171         T{ ##box-alien f 1 0 }
2172         T{ ##unbox-alien f 2 1 }
2173         T{ ##replace f 2 D 0 }
2174     } value-numbering-step
2175 ] unit-test
2176
2177 [
2178     {
2179         T{ ##peek f 0 D 0 }
2180         T{ ##box-alien f 1 0 }
2181         T{ ##copy f 2 0 any-rep }
2182         T{ ##replace f 2 D 0 }
2183     }
2184 ] [
2185     {
2186         T{ ##peek f 0 D 0 }
2187         T{ ##box-alien f 1 0 }
2188         T{ ##unbox-any-c-ptr f 2 1 }
2189         T{ ##replace f 2 D 0 }
2190     } value-numbering-step
2191 ] unit-test
2192
2193 [
2194     {
2195         T{ ##peek f 0 D 0 }
2196         T{ ##load-integer f 2 0 }
2197         T{ ##copy f 1 0 any-rep }
2198         T{ ##replace f 1 D 0 }
2199     }
2200 ] [
2201     {
2202         T{ ##peek f 0 D 0 }
2203         T{ ##load-integer f 2 0 }
2204         T{ ##box-displaced-alien f 1 2 0 c-ptr }
2205         T{ ##replace f 1 D 0 }
2206     } value-numbering-step
2207 ] unit-test
2208
2209 3 vreg-counter set-global
2210
2211 [
2212     {
2213         T{ ##peek f 0 D 0 }
2214         T{ ##load-integer f 2 16 }
2215         T{ ##box-displaced-alien f 1 2 0 c-ptr }
2216         T{ ##unbox-any-c-ptr f 4 0 }
2217         T{ ##add-imm f 3 4 16 }
2218     }
2219 ] [
2220     {
2221         T{ ##peek f 0 D 0 }
2222         T{ ##load-integer f 2 16 }
2223         T{ ##box-displaced-alien f 1 2 0 c-ptr }
2224         T{ ##unbox-any-c-ptr f 3 1 }
2225     } value-numbering-step
2226 ] unit-test
2227
2228 4 vreg-counter set-global
2229
2230 [
2231     {
2232         T{ ##box-alien f 0 1 }
2233         T{ ##load-integer f 2 16 }
2234         T{ ##box-displaced-alien f 3 2 0 c-ptr }
2235         T{ ##copy f 5 1 any-rep }
2236         T{ ##add-imm f 4 5 16 }
2237     }
2238 ] [
2239     {
2240         T{ ##box-alien f 0 1 }
2241         T{ ##load-integer f 2 16 }
2242         T{ ##box-displaced-alien f 3 2 0 c-ptr }
2243         T{ ##unbox-any-c-ptr f 4 3 }
2244     } value-numbering-step
2245 ] unit-test
2246
2247 3 vreg-counter set-global
2248
2249 [
2250     {
2251         T{ ##peek f 0 D 0 }
2252         T{ ##load-integer f 2 0 }
2253         T{ ##copy f 3 0 any-rep }
2254         T{ ##replace f 3 D 1 }
2255     }
2256 ] [
2257     {
2258         T{ ##peek f 0 D 0 }
2259         T{ ##load-integer f 2 0 }
2260         T{ ##box-displaced-alien f 3 2 0 c-ptr }
2261         T{ ##replace f 3 D 1 }
2262     } value-numbering-step
2263 ] unit-test
2264
2265 ! Various SIMD simplifications
2266 [
2267     {
2268         T{ ##vector>scalar f 1 0 float-4-rep }
2269         T{ ##copy f 2 0 any-rep }
2270     }
2271 ] [
2272     {
2273         T{ ##vector>scalar f 1 0 float-4-rep }
2274         T{ ##scalar>vector f 2 1 float-4-rep }
2275     } value-numbering-step
2276 ] unit-test
2277
2278 [
2279     {
2280         T{ ##copy f 1 0 any-rep }
2281     }
2282 ] [
2283     {
2284         T{ ##shuffle-vector-imm f 1 0 { 0 1 2 3 } float-4-rep }
2285     } value-numbering-step
2286 ] unit-test
2287
2288 [
2289     {
2290         T{ ##shuffle-vector-imm f 1 0 { 1 2 3 0 } float-4-rep }
2291         T{ ##shuffle-vector-imm f 2 0 { 0 2 3 1 } float-4-rep }
2292     }
2293 ] [
2294     {
2295         T{ ##shuffle-vector-imm f 1 0 { 1 2 3 0 } float-4-rep }
2296         T{ ##shuffle-vector-imm f 2 1 { 3 1 2 0 } float-4-rep }
2297     } value-numbering-step
2298 ] unit-test
2299
2300 [
2301     {
2302         T{ ##shuffle-vector-imm f 1 0 { 1 2 3 0 } float-4-rep }
2303         T{ ##shuffle-vector-imm f 2 1 { 1 0 } double-2-rep }
2304     }
2305 ] [
2306     {
2307         T{ ##shuffle-vector-imm f 1 0 { 1 2 3 0 } float-4-rep }
2308         T{ ##shuffle-vector-imm f 2 1 { 1 0 } double-2-rep }
2309     } value-numbering-step
2310 ] unit-test
2311
2312 [
2313     {
2314         T{ ##load-integer f 0 55 }
2315         T{ ##load-reference f 1 B{ 55 0 0 0  55 0 0 0  55 0 0 0  55 0 0 0 } }
2316         T{ ##load-reference f 2 B{ 55 0 0 0  55 0 0 0  55 0 0 0  55 0 0 0 } }
2317     }
2318 ] [
2319     {
2320         T{ ##load-integer f 0 55 }
2321         T{ ##scalar>vector f 1 0 int-4-rep }
2322         T{ ##shuffle-vector-imm f 2 1 { 0 0 0 0 } float-4-rep }
2323     } value-numbering-step
2324 ] unit-test
2325
2326 [
2327     {
2328         T{ ##load-reference f 0 1.25 }
2329         T{ ##load-reference f 1 B{ 0 0 160 63 0 0 160 63 0 0 160 63 0 0 160 63 } }
2330         T{ ##load-reference f 2 B{ 0 0 160 63 0 0 160 63 0 0 160 63 0 0 160 63 } }
2331     }
2332 ] [
2333     {
2334         T{ ##load-reference f 0 1.25 }
2335         T{ ##scalar>vector f 1 0 float-4-rep }
2336         T{ ##shuffle-vector-imm f 2 1 { 0 0 0 0 } float-4-rep }
2337     } value-numbering-step
2338 ] unit-test
2339
2340 [
2341     {
2342         T{ ##load-reference f 0 1.25 }
2343         T{ ##load-reference f 1 B{ 0 0 160 63 0 0 160 63 0 0 160 63 0 0 160 63 } }
2344         T{ ##load-reference f 2 B{ 0 0 160 63 0 0 160 63 0 0 160 63 0 0 160 63 } }
2345     }
2346 ] [
2347     {
2348         T{ ##load-reference f 0 1.25 }
2349         T{ ##scalar>vector f 1 0 float-4-rep }
2350         T{ ##shuffle-vector-imm f 2 1 { 0 0 0 0 } float-4-rep }
2351     } value-numbering-step
2352 ] unit-test
2353
2354 [
2355     {
2356         T{ ##load-integer f 0 55 }
2357         T{ ##load-reference f 1 B{ 55 0 55 0 55 0 55 0 55 0 55 0 55 0 55 0 } }
2358         T{ ##load-reference f 2 B{ 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 } }
2359         T{ ##load-reference f 3 B{ 0 55 0 55 0 55 0 55 0 55 0 55 0 55 0 55 } }
2360     }
2361 ] [
2362     {
2363         T{ ##load-integer f 0 55 }
2364         T{ ##scalar>vector f 1 0 short-8-rep }
2365         T{ ##load-reference f 2 B{ 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 } }
2366         T{ ##shuffle-vector f 3 1 2 float-4-rep }
2367     } value-numbering-step
2368 ] unit-test
2369
2370 [
2371     {
2372         T{ ##load-reference f 0 1.25 }
2373         T{ ##load-reference f 2 3.75 }
2374         T{ ##load-reference f 4 B{ 0 0 0 0 0 0 244 63 0 0 0 0 0 0 14 64 } }
2375     }
2376 ] [
2377     {
2378         T{ ##load-reference f 0 1.25 }
2379         T{ ##load-reference f 2 3.75 }
2380         T{ ##gather-vector-2 f 4 0 2 double-2-rep }
2381     } value-numbering-step
2382 ] unit-test
2383
2384 [
2385     {
2386         T{ ##load-integer f 0 125 }
2387         T{ ##load-integer f 2 375 }
2388         T{ ##load-reference f 4 B{ 125 0 0 0 0 0 0 0 119 1 0 0 0 0 0 0 } }
2389     }
2390 ] [
2391     {
2392         T{ ##load-integer f 0 125 }
2393         T{ ##load-integer f 2 375 }
2394         T{ ##gather-vector-2 f 4 0 2 longlong-2-rep }
2395     } value-numbering-step
2396 ] unit-test
2397
2398 [
2399     {
2400         T{ ##load-reference f 0 1.25 }
2401         T{ ##load-reference f 1 2.50 }
2402         T{ ##load-reference f 2 3.75 }
2403         T{ ##load-reference f 3 5.00 }
2404         T{ ##load-reference f 4 B{ 0 0 160 63 0 0 32 64 0 0 112 64 0 0 160 64 } }
2405     }
2406 ] [
2407     {
2408         T{ ##load-reference f 0 1.25 }
2409         T{ ##load-reference f 1 2.50 }
2410         T{ ##load-reference f 2 3.75 }
2411         T{ ##load-reference f 3 5.00 }
2412         T{ ##gather-vector-4 f 4 0 1 2 3 float-4-rep }
2413     } value-numbering-step
2414 ] unit-test
2415
2416 [
2417     {
2418         T{ ##load-integer f 0 125 }
2419         T{ ##load-integer f 1 250 }
2420         T{ ##load-integer f 2 375 }
2421         T{ ##load-integer f 3 500 }
2422         T{ ##load-reference f 4 B{ 125 0 0 0 250 0 0 0 119 1 0 0 244 1 0 0 } }
2423     }
2424 ] [
2425     {
2426         T{ ##load-integer f 0 125 }
2427         T{ ##load-integer f 1 250 }
2428         T{ ##load-integer f 2 375 }
2429         T{ ##load-integer f 3 500 }
2430         T{ ##gather-vector-4 f 4 0 1 2 3 int-4-rep }
2431     } value-numbering-step
2432 ] unit-test
2433
2434 [
2435     {
2436         T{ ##zero-vector f 2 float-4-rep }
2437     }
2438 ] [
2439     {
2440         T{ ##xor-vector f 2 1 1 float-4-rep }
2441     } value-numbering-step
2442 ] unit-test
2443
2444 ! NOT x AND y => x ANDN y
2445
2446 [
2447     {
2448         T{ ##fill-vector f 3 float-4-rep }
2449         T{ ##xor-vector  f 4 0 3 float-4-rep }
2450         T{ ##andn-vector f 5 0 1 float-4-rep }
2451     }
2452 ] [
2453     {
2454         T{ ##fill-vector f 3 float-4-rep }
2455         T{ ##xor-vector  f 4 0 3 float-4-rep }
2456         T{ ##and-vector  f 5 4 1 float-4-rep }
2457     } value-numbering-step
2458 ] unit-test
2459
2460 [
2461     {
2462         T{ ##not-vector  f 4 0 float-4-rep }
2463         T{ ##andn-vector f 5 0 1 float-4-rep }
2464     }
2465 ] [
2466     {
2467         T{ ##not-vector  f 4 0 float-4-rep }
2468         T{ ##and-vector  f 5 4 1 float-4-rep }
2469     } value-numbering-step
2470 ] unit-test
2471
2472 ! x AND NOT y => y ANDN x
2473
2474 [
2475     {
2476         T{ ##fill-vector f 3 float-4-rep }
2477         T{ ##xor-vector  f 4 0 3 float-4-rep }
2478         T{ ##andn-vector f 5 0 1 float-4-rep }
2479     }
2480 ] [
2481     {
2482         T{ ##fill-vector f 3 float-4-rep }
2483         T{ ##xor-vector  f 4 0 3 float-4-rep }
2484         T{ ##and-vector  f 5 1 4 float-4-rep }
2485     } value-numbering-step
2486 ] unit-test
2487
2488 [
2489     {
2490         T{ ##not-vector  f 4 0 float-4-rep }
2491         T{ ##andn-vector f 5 0 1 float-4-rep }
2492     }
2493 ] [
2494     {
2495         T{ ##not-vector  f 4 0 float-4-rep }
2496         T{ ##and-vector  f 5 1 4 float-4-rep }
2497     } value-numbering-step
2498 ] unit-test
2499
2500 ! NOT x ANDN y => x AND y
2501
2502 [
2503     {
2504         T{ ##fill-vector f 3 float-4-rep }
2505         T{ ##xor-vector  f 4 0 3 float-4-rep }
2506         T{ ##and-vector  f 5 0 1 float-4-rep }
2507     }
2508 ] [
2509     {
2510         T{ ##fill-vector f 3 float-4-rep }
2511         T{ ##xor-vector  f 4 0 3 float-4-rep }
2512         T{ ##andn-vector f 5 4 1 float-4-rep }
2513     } value-numbering-step
2514 ] unit-test
2515
2516 [
2517     {
2518         T{ ##not-vector  f 4 0 float-4-rep }
2519         T{ ##and-vector  f 5 0 1 float-4-rep }
2520     }
2521 ] [
2522     {
2523         T{ ##not-vector  f 4 0 float-4-rep }
2524         T{ ##andn-vector f 5 4 1 float-4-rep }
2525     } value-numbering-step
2526 ] unit-test
2527
2528 ! AND <=> ANDN
2529
2530 [
2531     {
2532         T{ ##fill-vector f 3 float-4-rep }
2533         T{ ##xor-vector  f 4 0 3 float-4-rep }
2534         T{ ##andn-vector f 5 0 1 float-4-rep }
2535         T{ ##and-vector  f 6 0 2 float-4-rep }
2536         T{ ##or-vector   f 7 5 6 float-4-rep }
2537     }
2538 ] [
2539     {
2540         T{ ##fill-vector f 3 float-4-rep }
2541         T{ ##xor-vector  f 4 0 3 float-4-rep }
2542         T{ ##and-vector  f 5 4 1 float-4-rep }
2543         T{ ##andn-vector f 6 4 2 float-4-rep }
2544         T{ ##or-vector   f 7 5 6 float-4-rep }
2545     } value-numbering-step
2546 ] unit-test
2547
2548 [
2549     {
2550         T{ ##not-vector  f 4 0   float-4-rep }
2551         T{ ##andn-vector f 5 0 1 float-4-rep }
2552         T{ ##and-vector  f 6 0 2 float-4-rep }
2553         T{ ##or-vector   f 7 5 6 float-4-rep }
2554     }
2555 ] [
2556     {
2557         T{ ##not-vector  f 4 0   float-4-rep }
2558         T{ ##and-vector  f 5 4 1 float-4-rep }
2559         T{ ##andn-vector f 6 4 2 float-4-rep }
2560         T{ ##or-vector   f 7 5 6 float-4-rep }
2561     } value-numbering-step
2562 ] unit-test
2563
2564 ! Branch folding
2565 : test-branch-folding ( insns -- insns' n )
2566     <basic-block>
2567     [ V{ 0 1 } clone >>successors basic-block set value-numbering-step ] keep
2568     successors>> first ;
2569
2570 [
2571     {
2572         T{ ##load-integer f 1 1 }
2573         T{ ##load-integer f 2 2 }
2574         T{ ##branch }
2575     }
2576     1
2577 ] [
2578     {
2579         T{ ##load-integer f 1 1 }
2580         T{ ##load-integer f 2 2 }
2581         T{ ##compare-branch f 1 2 cc= }
2582     } test-branch-folding
2583 ] unit-test
2584
2585 [
2586     {
2587         T{ ##load-integer f 1 1 }
2588         T{ ##load-integer f 2 2 }
2589         T{ ##branch }
2590     }
2591     0
2592 ] [
2593     {
2594         T{ ##load-integer f 1 1 }
2595         T{ ##load-integer f 2 2 }
2596         T{ ##compare-branch f 1 2 cc/= }
2597     } test-branch-folding
2598 ] unit-test
2599
2600 [
2601     {
2602         T{ ##load-integer f 1 1 }
2603         T{ ##load-integer f 2 2 }
2604         T{ ##branch }
2605     }
2606     0
2607 ] [
2608     {
2609         T{ ##load-integer f 1 1 }
2610         T{ ##load-integer f 2 2 }
2611         T{ ##compare-integer-branch f 1 2 cc< }
2612     } test-branch-folding
2613 ] unit-test
2614
2615 [
2616     {
2617         T{ ##load-integer f 1 1 }
2618         T{ ##load-integer f 2 2 }
2619         T{ ##branch }
2620     }
2621     1
2622 ] [
2623     {
2624         T{ ##load-integer f 1 1 }
2625         T{ ##load-integer f 2 2 }
2626         T{ ##compare-integer-branch f 2 1 cc< }
2627     } test-branch-folding
2628 ] unit-test
2629
2630 [
2631     {
2632         T{ ##peek f 0 D 0 }
2633         T{ ##branch }
2634     }
2635     1
2636 ] [
2637     {
2638         T{ ##peek f 0 D 0 }
2639         T{ ##compare-integer-branch f 0 0 cc< }
2640     } test-branch-folding
2641 ] unit-test
2642
2643 [
2644     {
2645         T{ ##peek f 0 D 0 }
2646         T{ ##branch }
2647     }
2648     0
2649 ] [
2650     {
2651         T{ ##peek f 0 D 0 }
2652         T{ ##compare-integer-branch f 0 0 cc<= }
2653     } test-branch-folding
2654 ] unit-test
2655
2656 [
2657     {
2658         T{ ##peek f 0 D 0 }
2659         T{ ##branch }
2660     }
2661     1
2662 ] [
2663     {
2664         T{ ##peek f 0 D 0 }
2665         T{ ##compare-integer-branch f 0 0 cc> }
2666     } test-branch-folding
2667 ] unit-test
2668
2669 [
2670     {
2671         T{ ##peek f 0 D 0 }
2672         T{ ##branch }
2673     }
2674     0
2675 ] [
2676     {
2677         T{ ##peek f 0 D 0 }
2678         T{ ##compare-integer-branch f 0 0 cc>= }
2679     } test-branch-folding
2680 ] unit-test
2681
2682 [
2683     {
2684         T{ ##peek f 0 D 0 }
2685         T{ ##branch }
2686     }
2687     0
2688 ] [
2689     {
2690         T{ ##peek f 0 D 0 }
2691         T{ ##compare-integer-branch f 0 0 cc= }
2692     } test-branch-folding
2693 ] unit-test
2694
2695 [
2696     {
2697         T{ ##peek f 0 D 0 }
2698         T{ ##branch }
2699     }
2700     1
2701 ] [
2702     {
2703         T{ ##peek f 0 D 0 }
2704         T{ ##compare-integer-branch f 0 0 cc/= }
2705     } test-branch-folding
2706 ] unit-test
2707
2708 [
2709     {
2710         T{ ##peek f 0 D 0 }
2711         T{ ##load-reference f 1 t }
2712         T{ ##branch }
2713     }
2714     0
2715 ] [
2716     {
2717         T{ ##peek f 0 D 0 }
2718         T{ ##compare f 1 0 0 cc<= }
2719         T{ ##compare-imm-branch f 1 f cc/= }
2720     } test-branch-folding
2721 ] unit-test
2722
2723 ! More branch folding tests
2724 V{ T{ ##branch } } 0 test-bb
2725
2726 V{
2727     T{ ##peek f 0 D 0 }
2728     T{ ##compare-integer-branch f 0 0 cc< }
2729 } 1 test-bb
2730
2731 V{
2732     T{ ##load-integer f 1 1 }
2733     T{ ##branch }
2734 } 2 test-bb
2735
2736 V{
2737     T{ ##load-integer f 2 2 }
2738     T{ ##branch }
2739 } 3 test-bb
2740
2741 V{
2742     T{ ##phi f 3 H{ { 2 1 } { 3 2 } } }
2743     T{ ##replace f 3 D 0 }
2744     T{ ##return }
2745 } 4 test-bb
2746
2747 test-diamond
2748
2749 [ ] [
2750     cfg new 0 get >>entry dup cfg set
2751     value-numbering
2752     select-representations
2753     destruct-ssa drop
2754 ] unit-test
2755
2756 [ 1 ] [ 1 get successors>> length ] unit-test
2757
2758 [ t ] [ 1 get successors>> first 3 get eq? ] unit-test
2759
2760 [ 2 ] [ 4 get instructions>> length ] unit-test
2761
2762 V{
2763     T{ ##peek f 0 D 0 }
2764     T{ ##branch }
2765 } 0 test-bb
2766
2767 V{
2768     T{ ##peek f 1 D 1 }
2769     T{ ##compare-integer-branch f 1 1 cc< }
2770 } 1 test-bb
2771
2772 V{
2773     T{ ##copy f 2 0 any-rep }
2774     T{ ##branch }
2775 } 2 test-bb
2776
2777 V{
2778     T{ ##phi f 3 H{ { 1 1 } { 2 0 } } }
2779     T{ ##branch }
2780 } 3 test-bb
2781
2782 V{
2783     T{ ##replace f 3 D 0 }
2784     T{ ##return }
2785 } 4 test-bb
2786
2787 test-diamond
2788
2789 [ ] [
2790     cfg new 0 get >>entry
2791     value-numbering
2792     eliminate-dead-code
2793     drop
2794 ] unit-test
2795
2796 [ t ] [ 1 get successors>> first 3 get eq? ] unit-test
2797
2798 [ 1 ] [ 3 get instructions>> first inputs>> assoc-size ] unit-test
2799
2800 V{ T{ ##prologue } T{ ##branch } } 0 test-bb
2801
2802 V{
2803     T{ ##peek { dst 15 } { loc D 0 } }
2804     T{ ##copy { dst 16 } { src 15 } { rep any-rep } }
2805     T{ ##copy { dst 17 } { src 15 } { rep any-rep } }
2806     T{ ##copy { dst 18 } { src 15 } { rep any-rep } }
2807     T{ ##copy { dst 19 } { src 15 } { rep any-rep } }
2808     T{ ##compare
2809         { dst 20 }
2810         { src1 18 }
2811         { src2 19 }
2812         { cc cc= }
2813         { temp 22 }
2814     }
2815     T{ ##copy { dst 21 } { src 20 } { rep any-rep } }
2816     T{ ##compare-imm-branch
2817         { src1 21 }
2818         { src2 f }
2819         { cc cc/= }
2820     }
2821 } 1 test-bb
2822
2823 V{
2824     T{ ##copy { dst 23 } { src 15 } { rep any-rep } }
2825     T{ ##copy { dst 24 } { src 15 } { rep any-rep } }
2826     T{ ##load-reference { dst 25 } { obj t } }
2827     T{ ##branch }
2828 } 2 test-bb
2829
2830 V{
2831     T{ ##replace { src 25 } { loc D 0 } }
2832     T{ ##epilogue }
2833     T{ ##return }
2834 } 3 test-bb
2835
2836 V{
2837     T{ ##copy { dst 26 } { src 15 } { rep any-rep } }
2838     T{ ##copy { dst 27 } { src 15 } { rep any-rep } }
2839     T{ ##add
2840         { dst 28 }
2841         { src1 26 }
2842         { src2 27 }
2843     }
2844     T{ ##branch }
2845 } 4 test-bb
2846
2847 V{
2848     T{ ##replace { src 28 } { loc D 0 } }
2849     T{ ##epilogue }
2850     T{ ##return }
2851 } 5 test-bb
2852
2853 0 1 edge
2854 1 { 2 4 } edges
2855 2 3 edge
2856 4 5 edge
2857
2858 [ ] [
2859     cfg new 0 get >>entry
2860     value-numbering eliminate-dead-code drop
2861 ] unit-test
2862
2863 [ f ] [ 1 get instructions>> [ ##peek? ] any? ] unit-test
2864
2865 ! Slot addressing optimization
2866 cpu x86? [
2867     [
2868         V{
2869             T{ ##peek f 0 D 0 }
2870             T{ ##peek f 1 D 1 }
2871             T{ ##add-imm f 2 1 2 }
2872             T{ ##slot f 3 0 1 $[ cell log2 ] $[ 7 2 cells - ] }
2873         }
2874     ] [
2875         V{
2876             T{ ##peek f 0 D 0 }
2877             T{ ##peek f 1 D 1 }
2878             T{ ##add-imm f 2 1 2 }
2879             T{ ##slot f 3 0 2 $[ cell log2 ] 7 }
2880         } value-numbering-step
2881     ] unit-test
2882 ] when
2883
2884 ! Alien addressing optimization
2885
2886 ! Base offset fusion on ##load/store-memory-imm
2887 [
2888     V{
2889         T{ ##peek f 1 D 0 }
2890         T{ ##tagged>integer f 2 1 }
2891         T{ ##add-imm f 3 2 10 }
2892         T{ ##load-memory-imm f 4 2 10 int-rep c:uchar }
2893     }
2894 ] [
2895     V{
2896         T{ ##peek f 1 D 0 }
2897         T{ ##tagged>integer f 2 1 }
2898         T{ ##add-imm f 3 2 10 }
2899         T{ ##load-memory-imm f 4 3 0 int-rep c:uchar }
2900     } value-numbering-step
2901 ] unit-test
2902
2903 [
2904     V{
2905         T{ ##peek f 0 D 0 }
2906         T{ ##peek f 1 D 1 }
2907         T{ ##tagged>integer f 2 0 }
2908         T{ ##tagged>integer f 3 1 }
2909         T{ ##add-imm f 4 3 10 }
2910         T{ ##store-memory-imm f 2 3 10 int-rep c:uchar }
2911     }
2912 ] [
2913     V{
2914         T{ ##peek f 0 D 0 }
2915         T{ ##peek f 1 D 1 }
2916         T{ ##tagged>integer f 2 0 }
2917         T{ ##tagged>integer f 3 1 }
2918         T{ ##add-imm f 4 3 10 }
2919         T{ ##store-memory-imm f 2 4 0 int-rep c:uchar }
2920     } value-numbering-step
2921 ] unit-test
2922
2923 ! Displacement fusion on ##load/store-memory-imm
2924 [
2925     V{
2926         T{ ##peek f 0 D 0 }
2927         T{ ##peek f 1 D 1 }
2928         T{ ##tagged>integer f 2 0 }
2929         T{ ##tagged>integer f 3 1 }
2930         T{ ##add f 4 2 3 }
2931         T{ ##load-memory f 5 2 3 0 0 int-rep c:uchar }
2932     }
2933 ] [
2934     V{
2935         T{ ##peek f 0 D 0 }
2936         T{ ##peek f 1 D 1 }
2937         T{ ##tagged>integer f 2 0 }
2938         T{ ##tagged>integer f 3 1 }
2939         T{ ##add f 4 2 3 }
2940         T{ ##load-memory-imm f 5 4 0 int-rep c:uchar }
2941     } value-numbering-step
2942 ] unit-test
2943
2944 [
2945     V{
2946         T{ ##peek f 0 D 0 }
2947         T{ ##peek f 1 D 1 }
2948         T{ ##tagged>integer f 2 0 }
2949         T{ ##tagged>integer f 3 1 }
2950         T{ ##add f 4 2 3 }
2951         T{ ##store-memory f 5 2 3 0 0 int-rep c:uchar }
2952     }
2953 ] [
2954     V{
2955         T{ ##peek f 0 D 0 }
2956         T{ ##peek f 1 D 1 }
2957         T{ ##tagged>integer f 2 0 }
2958         T{ ##tagged>integer f 3 1 }
2959         T{ ##add f 4 2 3 }
2960         T{ ##store-memory-imm f 5 4 0 int-rep c:uchar }
2961     } value-numbering-step
2962 ] unit-test
2963
2964 ! Base offset fusion on ##load/store-memory -- only on x86
2965 cpu x86?
2966 [
2967     V{
2968         T{ ##peek f 0 D 0 }
2969         T{ ##peek f 1 D 1 }
2970         T{ ##tagged>integer f 2 0 }
2971         T{ ##tagged>integer f 3 1 }
2972         T{ ##add-imm f 4 2 31337 }
2973         T{ ##load-memory f 5 2 3 0 31337 int-rep c:uchar }
2974     }
2975 ]
2976 [
2977     V{
2978         T{ ##peek f 0 D 0 }
2979         T{ ##peek f 1 D 1 }
2980         T{ ##tagged>integer f 2 0 }
2981         T{ ##tagged>integer f 3 1 }
2982         T{ ##add-imm f 4 2 31337 }
2983         T{ ##load-memory f 5 4 3 0 0 int-rep c:uchar }
2984     }
2985 ] ?
2986 [
2987     V{
2988         T{ ##peek f 0 D 0 }
2989         T{ ##peek f 1 D 1 }
2990         T{ ##tagged>integer f 2 0 }
2991         T{ ##tagged>integer f 3 1 }
2992         T{ ##add-imm f 4 2 31337 }
2993         T{ ##load-memory f 5 4 3 0 0 int-rep c:uchar }
2994     } value-numbering-step
2995 ] unit-test
2996
2997 ! Displacement offset fusion on ##load/store-memory -- only on x86
2998 cpu x86?
2999 [
3000     V{
3001         T{ ##peek f 0 D 0 }
3002         T{ ##peek f 1 D 1 }
3003         T{ ##tagged>integer f 2 0 }
3004         T{ ##tagged>integer f 3 1 }
3005         T{ ##add-imm f 4 3 31337 }
3006         T{ ##load-memory f 5 2 3 0 31338 int-rep c:uchar }
3007     }
3008 ]
3009 [
3010     V{
3011         T{ ##peek f 0 D 0 }
3012         T{ ##peek f 1 D 1 }
3013         T{ ##tagged>integer f 2 0 }
3014         T{ ##tagged>integer f 3 1 }
3015         T{ ##add-imm f 4 3 31337 }
3016         T{ ##load-memory f 5 2 4 0 1 int-rep c:uchar }
3017     }
3018 ] ?
3019 [
3020     V{
3021         T{ ##peek f 0 D 0 }
3022         T{ ##peek f 1 D 1 }
3023         T{ ##tagged>integer f 2 0 }
3024         T{ ##tagged>integer f 3 1 }
3025         T{ ##add-imm f 4 3 31337 }
3026         T{ ##load-memory f 5 2 4 0 1 int-rep c:uchar }
3027     } value-numbering-step
3028 ] unit-test
3029
3030 ! Displacement offset fusion should not occur on
3031 ! ##load/store-memory with non-zero scale
3032 [ ] [
3033     V{
3034         T{ ##peek f 0 D 0 }
3035         T{ ##peek f 1 D 1 }
3036         T{ ##tagged>integer f 2 0 }
3037         T{ ##tagged>integer f 3 1 }
3038         T{ ##add-imm f 4 3 10 }
3039         T{ ##load-memory f 5 2 4 1 1 int-rep c:uchar }
3040     } dup value-numbering-step assert=
3041 ] unit-test
3042
3043 ! Scale fusion on ##load/store-memory
3044 cpu x86?
3045 [
3046     V{
3047         T{ ##peek f 0 D 0 }
3048         T{ ##peek f 1 D 1 }
3049         T{ ##tagged>integer f 2 0 }
3050         T{ ##tagged>integer f 3 1 }
3051         T{ ##shl-imm f 4 3 2 }
3052         T{ ##load-memory f 5 2 3 2 0 int-rep c:uchar }
3053     }
3054 ]
3055 [
3056     V{
3057         T{ ##peek f 0 D 0 }
3058         T{ ##peek f 1 D 1 }
3059         T{ ##tagged>integer f 2 0 }
3060         T{ ##tagged>integer f 3 1 }
3061         T{ ##shl-imm f 4 3 2 }
3062         T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
3063     }
3064 ] ?
3065 [
3066     V{
3067         T{ ##peek f 0 D 0 }
3068         T{ ##peek f 1 D 1 }
3069         T{ ##tagged>integer f 2 0 }
3070         T{ ##tagged>integer f 3 1 }
3071         T{ ##shl-imm f 4 3 2 }
3072         T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
3073     } value-numbering-step
3074 ] unit-test
3075
3076 cpu x86? [
3077     ! Don't do scale fusion if there's already a scale
3078     [ ] [
3079         V{
3080             T{ ##peek f 0 D 0 }
3081             T{ ##peek f 1 D 1 }
3082             T{ ##tagged>integer f 2 0 }
3083             T{ ##tagged>integer f 3 1 }
3084             T{ ##shl-imm f 4 3 2 }
3085             T{ ##load-memory f 5 2 4 1 0 int-rep c:uchar }
3086         } dup value-numbering-step assert=
3087     ] unit-test
3088
3089     ! Don't do scale fusion if the scale factor is out of range
3090     [ ] [
3091         V{
3092             T{ ##peek f 0 D 0 }
3093             T{ ##peek f 1 D 1 }
3094             T{ ##tagged>integer f 2 0 }
3095             T{ ##tagged>integer f 3 1 }
3096             T{ ##shl-imm f 4 3 4 }
3097             T{ ##load-memory f 5 2 4 0 0 int-rep c:uchar }
3098         } dup value-numbering-step assert=
3099     ] unit-test
3100 ] when