USING: compiler.cfg.value-numbering compiler.cfg.instructions compiler.cfg.registers compiler.cfg.debugger compiler.cfg.comparisons cpu.architecture tools.test kernel math combinators.short-circuit accessors sequences compiler.cfg.predecessors locals compiler.cfg.dce compiler.cfg.ssa.destruction compiler.cfg.loop-detection compiler.cfg.representations compiler.cfg assocs vectors arrays layouts literals namespaces alien ; IN: compiler.cfg.value-numbering.tests : trim-temps ( insns -- insns ) [ dup { [ ##compare? ] [ ##compare-imm? ] [ ##compare-float-unordered? ] [ ##compare-float-ordered? ] [ ##test-vector? ] [ ##test-vector-branch? ] } 1|| [ f >>temp ] when ] map ; ! Folding constants together [ { T{ ##load-constant f 0 0.0 } T{ ##load-constant f 1 -0.0 } T{ ##replace f 0 D 0 } T{ ##replace f 1 D 1 } } ] [ { T{ ##load-constant f 0 0.0 } T{ ##load-constant f 1 -0.0 } T{ ##replace f 0 D 0 } T{ ##replace f 1 D 1 } } value-numbering-step ] unit-test [ { T{ ##load-constant f 0 0.0 } T{ ##copy f 1 0 any-rep } T{ ##replace f 0 D 0 } T{ ##replace f 1 D 1 } } ] [ { T{ ##load-constant f 0 0.0 } T{ ##load-constant f 1 0.0 } T{ ##replace f 0 D 0 } T{ ##replace f 1 D 1 } } value-numbering-step ] unit-test [ { T{ ##load-constant f 0 t } T{ ##copy f 1 0 any-rep } T{ ##replace f 0 D 0 } T{ ##replace f 1 D 1 } } ] [ { T{ ##load-constant f 0 t } T{ ##load-constant f 1 t } T{ ##replace f 0 D 0 } T{ ##replace f 1 D 1 } } value-numbering-step ] unit-test ! Compare propagation [ { T{ ##load-reference f 1 + } T{ ##peek f 2 D 0 } T{ ##compare f 4 2 1 cc> } T{ ##copy f 6 4 any-rep } T{ ##replace f 6 D 0 } } ] [ { T{ ##load-reference f 1 + } T{ ##peek f 2 D 0 } T{ ##compare f 4 2 1 cc> } T{ ##compare-imm f 6 4 5 cc/= } T{ ##replace f 6 D 0 } } value-numbering-step trim-temps ] unit-test [ { T{ ##load-reference f 1 + } T{ ##peek f 2 D 0 } T{ ##compare f 4 2 1 cc<= } T{ ##compare f 6 2 1 cc/<= } T{ ##replace f 6 D 0 } } ] [ { T{ ##load-reference f 1 + } T{ ##peek f 2 D 0 } T{ ##compare f 4 2 1 cc<= } T{ ##compare-imm f 6 4 5 cc= } T{ ##replace f 6 D 0 } } value-numbering-step trim-temps ] unit-test [ { T{ ##peek f 8 D 0 } T{ ##peek f 9 D -1 } T{ ##compare-float-unordered f 12 8 9 cc< } T{ ##compare-float-unordered f 14 8 9 cc/< } T{ ##replace f 14 D 0 } } ] [ { T{ ##peek f 8 D 0 } T{ ##peek f 9 D -1 } T{ ##compare-float-unordered f 12 8 9 cc< } T{ ##compare-imm f 14 12 5 cc= } T{ ##replace f 14 D 0 } } value-numbering-step trim-temps ] unit-test [ { T{ ##peek f 29 D -1 } T{ ##peek f 30 D -2 } T{ ##compare f 33 29 30 cc<= } T{ ##compare-branch f 29 30 cc<= } } ] [ { T{ ##peek f 29 D -1 } T{ ##peek f 30 D -2 } T{ ##compare f 33 29 30 cc<= } T{ ##compare-imm-branch f 33 5 cc/= } } value-numbering-step trim-temps ] unit-test [ { T{ ##peek f 1 D -1 } T{ ##test-vector f 2 1 f float-4-rep vcc-any } T{ ##test-vector-branch f 1 f float-4-rep vcc-any } } ] [ { T{ ##peek f 1 D -1 } T{ ##test-vector f 2 1 f float-4-rep vcc-any } T{ ##compare-imm-branch f 2 5 cc/= } } value-numbering-step trim-temps ] unit-test ! Immediate operand conversion [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##add-imm f 2 0 100 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##add f 2 0 1 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##add-imm f 2 0 100 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##add f 2 1 0 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##add-imm f 2 0 -100 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##sub f 2 0 1 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 0 } } ] [ { T{ ##peek f 0 D 0 } T{ ##sub f 1 0 0 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##mul-imm f 2 0 100 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##mul f 2 0 1 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##mul-imm f 2 0 100 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##mul f 2 1 0 } } value-numbering-step ] unit-test [ { T{ ##peek f 1 D 0 } T{ ##shl-imm f 2 1 3 } } ] [ { T{ ##peek f 1 D 0 } T{ ##mul-imm f 2 1 8 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 -1 } T{ ##neg f 2 0 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 -1 } T{ ##mul f 2 0 1 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 -1 } T{ ##neg f 2 0 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 -1 } T{ ##mul f 2 1 0 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 0 } T{ ##neg f 2 0 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 0 } T{ ##sub f 2 1 0 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 0 } T{ ##neg f 2 0 } T{ ##copy f 3 0 any-rep } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 0 } T{ ##sub f 2 1 0 } T{ ##sub f 3 1 2 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##not f 1 0 } T{ ##copy f 2 0 any-rep } } ] [ { T{ ##peek f 0 D 0 } T{ ##not f 1 0 } T{ ##not f 2 1 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##and-imm f 2 0 100 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##and f 2 0 1 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##and-imm f 2 0 100 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##and f 2 1 0 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##or-imm f 2 0 100 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##or f 2 0 1 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##or-imm f 2 0 100 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##or f 2 1 0 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##xor-imm f 2 0 100 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##xor f 2 0 1 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##xor-imm f 2 0 100 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##xor f 2 1 0 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##compare-imm f 2 0 100 cc<= } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##compare f 2 0 1 cc<= } } value-numbering-step trim-temps ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-constant f 1 3.5 } T{ ##compare f 2 0 1 cc= } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-constant f 1 3.5 } T{ ##compare f 2 0 1 cc= } } value-numbering-step trim-temps ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##compare-imm f 2 0 100 cc>= } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##compare f 2 1 0 cc<= } } value-numbering-step trim-temps ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##compare-imm-branch f 0 100 cc<= } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##compare-branch f 0 1 cc<= } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-constant f 1 3.5 } T{ ##compare-branch f 0 1 cc= } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-constant f 1 3.5 } T{ ##compare-branch f 0 1 cc= } } value-numbering-step trim-temps ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##compare-imm-branch f 0 100 cc>= } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##compare-branch f 1 0 cc<= } } value-numbering-step trim-temps ] unit-test ! Reassociation [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##add-imm f 2 0 100 } T{ ##load-immediate f 3 50 } T{ ##add-imm f 4 0 150 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##add f 2 0 1 } T{ ##load-immediate f 3 50 } T{ ##add f 4 2 3 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##add-imm f 2 0 100 } T{ ##load-immediate f 3 50 } T{ ##add-imm f 4 0 150 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##add f 2 1 0 } T{ ##load-immediate f 3 50 } T{ ##add f 4 3 2 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##add-imm f 2 0 100 } T{ ##load-immediate f 3 50 } T{ ##add-imm f 4 0 50 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##add f 2 0 1 } T{ ##load-immediate f 3 50 } T{ ##sub f 4 2 3 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##add-imm f 2 0 -100 } T{ ##load-immediate f 3 50 } T{ ##add-imm f 4 0 -150 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##sub f 2 0 1 } T{ ##load-immediate f 3 50 } T{ ##sub f 4 2 3 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##mul-imm f 2 0 100 } T{ ##load-immediate f 3 50 } T{ ##mul-imm f 4 0 5000 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##mul f 2 0 1 } T{ ##load-immediate f 3 50 } T{ ##mul f 4 2 3 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##mul-imm f 2 0 100 } T{ ##load-immediate f 3 50 } T{ ##mul-imm f 4 0 5000 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##mul f 2 1 0 } T{ ##load-immediate f 3 50 } T{ ##mul f 4 3 2 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##and-imm f 2 0 100 } T{ ##load-immediate f 3 50 } T{ ##and-imm f 4 0 32 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##and f 2 0 1 } T{ ##load-immediate f 3 50 } T{ ##and f 4 2 3 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##and-imm f 2 0 100 } T{ ##load-immediate f 3 50 } T{ ##and-imm f 4 0 32 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##and f 2 1 0 } T{ ##load-immediate f 3 50 } T{ ##and f 4 3 2 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##or-imm f 2 0 100 } T{ ##load-immediate f 3 50 } T{ ##or-imm f 4 0 118 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##or f 2 0 1 } T{ ##load-immediate f 3 50 } T{ ##or f 4 2 3 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##or-imm f 2 0 100 } T{ ##load-immediate f 3 50 } T{ ##or-imm f 4 0 118 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##or f 2 1 0 } T{ ##load-immediate f 3 50 } T{ ##or f 4 3 2 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##xor-imm f 2 0 100 } T{ ##load-immediate f 3 50 } T{ ##xor-imm f 4 0 86 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##xor f 2 0 1 } T{ ##load-immediate f 3 50 } T{ ##xor f 4 2 3 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##xor-imm f 2 0 100 } T{ ##load-immediate f 3 50 } T{ ##xor-imm f 4 0 86 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 100 } T{ ##xor f 2 1 0 } T{ ##load-immediate f 3 50 } T{ ##xor f 4 3 2 } } value-numbering-step ] unit-test ! Simplification [ { T{ ##peek f 0 D 0 } T{ ##peek f 1 D 1 } T{ ##load-immediate f 2 0 } T{ ##copy f 3 0 any-rep } T{ ##replace f 3 D 0 } } ] [ { T{ ##peek f 0 D 0 } T{ ##peek f 1 D 1 } T{ ##sub f 2 1 1 } T{ ##add f 3 0 2 } T{ ##replace f 3 D 0 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##peek f 1 D 1 } T{ ##load-immediate f 2 0 } T{ ##copy f 3 0 any-rep } T{ ##replace f 3 D 0 } } ] [ { T{ ##peek f 0 D 0 } T{ ##peek f 1 D 1 } T{ ##sub f 2 1 1 } T{ ##sub f 3 0 2 } T{ ##replace f 3 D 0 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##peek f 1 D 1 } T{ ##load-immediate f 2 0 } T{ ##copy f 3 0 any-rep } T{ ##replace f 3 D 0 } } ] [ { T{ ##peek f 0 D 0 } T{ ##peek f 1 D 1 } T{ ##sub f 2 1 1 } T{ ##or f 3 0 2 } T{ ##replace f 3 D 0 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##peek f 1 D 1 } T{ ##load-immediate f 2 0 } T{ ##copy f 3 0 any-rep } T{ ##replace f 3 D 0 } } ] [ { T{ ##peek f 0 D 0 } T{ ##peek f 1 D 1 } T{ ##sub f 2 1 1 } T{ ##xor f 3 0 2 } T{ ##replace f 3 D 0 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 1 } T{ ##copy f 2 0 any-rep } T{ ##replace f 2 D 0 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 1 } T{ ##mul f 2 0 1 } T{ ##replace f 2 D 0 } } value-numbering-step ] unit-test ! Constant folding [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 3 } T{ ##load-immediate f 3 4 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 3 } T{ ##add f 3 1 2 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 3 } T{ ##load-immediate f 3 -2 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 3 } T{ ##sub f 3 1 2 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 2 } T{ ##load-immediate f 2 3 } T{ ##load-immediate f 3 6 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 2 } T{ ##load-immediate f 2 3 } T{ ##mul f 3 1 2 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 2 } T{ ##load-immediate f 2 1 } T{ ##load-immediate f 3 0 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 2 } T{ ##load-immediate f 2 1 } T{ ##and f 3 1 2 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 2 } T{ ##load-immediate f 2 1 } T{ ##load-immediate f 3 3 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 2 } T{ ##load-immediate f 2 1 } T{ ##or f 3 1 2 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 2 } T{ ##load-immediate f 2 3 } T{ ##load-immediate f 3 1 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 2 } T{ ##load-immediate f 2 3 } T{ ##xor f 3 1 2 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 1 } T{ ##load-immediate f 3 8 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 1 } T{ ##shl-imm f 3 1 3 } } value-numbering-step ] unit-test cell 8 = [ [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 -1 } T{ ##load-immediate f 3 HEX: ffffffffffff } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 -1 } T{ ##shr-imm f 3 1 16 } } value-numbering-step ] unit-test ] when [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 -8 } T{ ##load-immediate f 3 -4 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 -8 } T{ ##sar-imm f 3 1 1 } } value-numbering-step ] unit-test cell 8 = [ [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 65536 } T{ ##load-immediate f 2 140737488355328 } T{ ##add f 3 0 2 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 65536 } T{ ##shl-imm f 2 1 31 } T{ ##add f 3 0 2 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 2 140737488355328 } T{ ##add f 3 0 2 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 2 140737488355328 } T{ ##add f 3 0 2 } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 2 2147483647 } T{ ##add-imm f 3 0 2147483647 } T{ ##add-imm f 4 3 2147483647 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 2 2147483647 } T{ ##add f 3 0 2 } T{ ##add f 4 3 2 } } value-numbering-step ] unit-test ] when ! Displaced alien optimizations 3 vreg-counter set-global [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 2 16 } T{ ##box-displaced-alien f 1 2 0 c-ptr } T{ ##unbox-any-c-ptr f 4 0 } T{ ##add-imm f 3 4 16 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 2 16 } T{ ##box-displaced-alien f 1 2 0 c-ptr } T{ ##unbox-any-c-ptr f 3 1 } } value-numbering-step ] unit-test 4 vreg-counter set-global [ { T{ ##box-alien f 0 1 } T{ ##load-immediate f 2 16 } T{ ##box-displaced-alien f 3 2 0 c-ptr } T{ ##copy f 5 1 any-rep } T{ ##add-imm f 4 5 16 } } ] [ { T{ ##box-alien f 0 1 } T{ ##load-immediate f 2 16 } T{ ##box-displaced-alien f 3 2 0 c-ptr } T{ ##unbox-any-c-ptr f 4 3 } } value-numbering-step ] unit-test 3 vreg-counter set-global [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 2 0 } T{ ##copy f 3 0 any-rep } T{ ##replace f 3 D 1 } } ] [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 2 0 } T{ ##box-displaced-alien f 3 2 0 c-ptr } T{ ##replace f 3 D 1 } } value-numbering-step ] unit-test ! Branch folding [ { T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 2 } T{ ##load-immediate f 3 5 } } ] [ { T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 2 } T{ ##compare f 3 1 2 cc= } } value-numbering-step ] unit-test [ { T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 2 } T{ ##load-constant f 3 t } } ] [ { T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 2 } T{ ##compare f 3 1 2 cc/= } } value-numbering-step ] unit-test [ { T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 2 } T{ ##load-constant f 3 t } } ] [ { T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 2 } T{ ##compare f 3 1 2 cc< } } value-numbering-step ] unit-test [ { T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 2 } T{ ##load-immediate f 3 5 } } ] [ { T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 2 } T{ ##compare f 3 2 1 cc< } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 5 } } ] [ { T{ ##peek f 0 D 0 } T{ ##compare f 1 0 0 cc< } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-constant f 1 t } } ] [ { T{ ##peek f 0 D 0 } T{ ##compare f 1 0 0 cc<= } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 5 } } ] [ { T{ ##peek f 0 D 0 } T{ ##compare f 1 0 0 cc> } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-constant f 1 t } } ] [ { T{ ##peek f 0 D 0 } T{ ##compare f 1 0 0 cc>= } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-immediate f 1 5 } } ] [ { T{ ##peek f 0 D 0 } T{ ##compare f 1 0 0 cc/= } } value-numbering-step ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-constant f 1 t } } ] [ { T{ ##peek f 0 D 0 } T{ ##compare f 1 0 0 cc= } } value-numbering-step ] unit-test [ { T{ ##vector>scalar f 1 0 float-4-rep } T{ ##copy f 2 0 any-rep } } ] [ { T{ ##vector>scalar f 1 0 float-4-rep } T{ ##scalar>vector f 2 1 float-4-rep } } value-numbering-step ] unit-test [ { T{ ##copy f 1 0 any-rep } } ] [ { T{ ##shuffle-vector f 1 0 { 0 1 2 3 } float-4-rep } } value-numbering-step ] unit-test [ { T{ ##shuffle-vector f 1 0 { 1 2 3 0 } float-4-rep } T{ ##shuffle-vector f 2 0 { 0 2 3 1 } float-4-rep } } ] [ { T{ ##shuffle-vector f 1 0 { 1 2 3 0 } float-4-rep } T{ ##shuffle-vector f 2 1 { 3 1 2 0 } float-4-rep } } value-numbering-step ] unit-test [ { T{ ##shuffle-vector f 1 0 { 1 2 3 0 } float-4-rep } T{ ##shuffle-vector f 2 1 { 1 0 } double-2-rep } } ] [ { T{ ##shuffle-vector f 1 0 { 1 2 3 0 } float-4-rep } T{ ##shuffle-vector f 2 1 { 1 0 } double-2-rep } } value-numbering-step ] unit-test [ { T{ ##load-constant f 0 $[ 55 tag-fixnum ] } T{ ##load-constant f 1 B{ 55 0 0 0 55 0 0 0 55 0 0 0 55 0 0 0 } } T{ ##copy f 2 1 any-rep } } ] [ { T{ ##load-constant f 0 $[ 55 tag-fixnum ] } T{ ##scalar>vector f 1 0 int-4-rep } T{ ##shuffle-vector f 2 1 { 0 0 0 0 } float-4-rep } } value-numbering-step ] unit-test [ { T{ ##load-constant f 0 1.25 } T{ ##load-constant f 1 B{ 0 0 160 63 0 0 160 63 0 0 160 63 0 0 160 63 } } T{ ##copy f 2 1 any-rep } } ] [ { T{ ##load-constant f 0 1.25 } T{ ##scalar>vector f 1 0 float-4-rep } T{ ##shuffle-vector f 2 1 { 0 0 0 0 } float-4-rep } } value-numbering-step ] unit-test [ { T{ ##zero-vector f 2 float-4-rep } } ] [ { T{ ##xor-vector f 2 1 1 float-4-rep } } value-numbering-step ] unit-test : test-branch-folding ( insns -- insns' n ) [ V{ 0 1 } clone >>successors basic-block set value-numbering-step ] keep successors>> first ; [ { T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 2 } T{ ##branch } } 1 ] [ { T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 2 } T{ ##compare-branch f 1 2 cc= } } test-branch-folding ] unit-test [ { T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 2 } T{ ##branch } } 0 ] [ { T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 2 } T{ ##compare-branch f 1 2 cc/= } } test-branch-folding ] unit-test [ { T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 2 } T{ ##branch } } 0 ] [ { T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 2 } T{ ##compare-branch f 1 2 cc< } } test-branch-folding ] unit-test [ { T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 2 } T{ ##branch } } 1 ] [ { T{ ##load-immediate f 1 1 } T{ ##load-immediate f 2 2 } T{ ##compare-branch f 2 1 cc< } } test-branch-folding ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##branch } } 1 ] [ { T{ ##peek f 0 D 0 } T{ ##compare-branch f 0 0 cc< } } test-branch-folding ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##branch } } 0 ] [ { T{ ##peek f 0 D 0 } T{ ##compare-branch f 0 0 cc<= } } test-branch-folding ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##branch } } 1 ] [ { T{ ##peek f 0 D 0 } T{ ##compare-branch f 0 0 cc> } } test-branch-folding ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##branch } } 0 ] [ { T{ ##peek f 0 D 0 } T{ ##compare-branch f 0 0 cc>= } } test-branch-folding ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##branch } } 0 ] [ { T{ ##peek f 0 D 0 } T{ ##compare-branch f 0 0 cc= } } test-branch-folding ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##branch } } 1 ] [ { T{ ##peek f 0 D 0 } T{ ##compare-branch f 0 0 cc/= } } test-branch-folding ] unit-test [ { T{ ##peek f 0 D 0 } T{ ##load-constant f 1 t } T{ ##branch } } 0 ] [ { T{ ##peek f 0 D 0 } T{ ##compare f 1 0 0 cc<= } T{ ##compare-imm-branch f 1 5 cc/= } } test-branch-folding ] unit-test ! More branch folding tests V{ T{ ##branch } } 0 test-bb V{ T{ ##peek f 0 D 0 } T{ ##compare-branch f 0 0 cc< } } 1 test-bb V{ T{ ##load-immediate f 1 1 } T{ ##branch } } 2 test-bb V{ T{ ##load-immediate f 2 2 } T{ ##branch } } 3 test-bb V{ T{ ##phi f 3 H{ { 2 1 } { 3 2 } } } T{ ##replace f 3 D 0 } T{ ##return } } 4 test-bb test-diamond [ ] [ cfg new 0 get >>entry dup cfg set value-numbering select-representations destruct-ssa drop ] unit-test [ 1 ] [ 1 get successors>> length ] unit-test [ t ] [ 1 get successors>> first 3 get eq? ] unit-test [ 2 ] [ 4 get instructions>> length ] unit-test V{ T{ ##peek f 0 D 0 } T{ ##branch } } 0 test-bb V{ T{ ##peek f 1 D 1 } T{ ##compare-branch f 1 1 cc< } } 1 test-bb V{ T{ ##copy f 2 0 any-rep } T{ ##branch } } 2 test-bb V{ T{ ##phi f 3 V{ } } T{ ##branch } } 3 test-bb V{ T{ ##replace f 3 D 0 } T{ ##return } } 4 test-bb 1 get 1 2array 2 get 0 2array 2array 3 get instructions>> first (>>inputs) test-diamond [ ] [ cfg new 0 get >>entry value-numbering eliminate-dead-code drop ] unit-test [ t ] [ 1 get successors>> first 3 get eq? ] unit-test [ 1 ] [ 3 get instructions>> first inputs>> assoc-size ] unit-test V{ T{ ##prologue } T{ ##branch } } 0 test-bb V{ T{ ##peek { dst 15 } { loc D 0 } } T{ ##copy { dst 16 } { src 15 } { rep any-rep } } T{ ##copy { dst 17 } { src 15 } { rep any-rep } } T{ ##copy { dst 18 } { src 15 } { rep any-rep } } T{ ##copy { dst 19 } { src 15 } { rep any-rep } } T{ ##compare { dst 20 } { src1 18 } { src2 19 } { cc cc= } { temp 22 } } T{ ##copy { dst 21 } { src 20 } { rep any-rep } } T{ ##compare-imm-branch { src1 21 } { src2 5 } { cc cc/= } } } 1 test-bb V{ T{ ##copy { dst 23 } { src 15 } { rep any-rep } } T{ ##copy { dst 24 } { src 15 } { rep any-rep } } T{ ##load-reference { dst 25 } { obj t } } T{ ##branch } } 2 test-bb V{ T{ ##replace { src 25 } { loc D 0 } } T{ ##epilogue } T{ ##return } } 3 test-bb V{ T{ ##copy { dst 26 } { src 15 } { rep any-rep } } T{ ##copy { dst 27 } { src 15 } { rep any-rep } } T{ ##add { dst 28 } { src1 26 } { src2 27 } } T{ ##branch } } 4 test-bb V{ T{ ##replace { src 28 } { loc D 0 } } T{ ##epilogue } T{ ##return } } 5 test-bb 0 1 edge 1 { 2 4 } edges 2 3 edge 4 5 edge [ ] [ cfg new 0 get >>entry value-numbering eliminate-dead-code drop ] unit-test [ f ] [ 1 get instructions>> [ ##peek? ] any? ] unit-test