diff --git a/basis/compiler/cfg/value-numbering/comparisons/comparisons.factor b/basis/compiler/cfg/value-numbering/comparisons/comparisons.factor index ed037c4d06..8bbacd2f29 100644 --- a/basis/compiler/cfg/value-numbering/comparisons/comparisons.factor +++ b/basis/compiler/cfg/value-numbering/comparisons/comparisons.factor @@ -280,21 +280,29 @@ M: ##compare-integer-imm rewrite M: ##test rewrite { - { [ dup src1>> vreg>insn ##load-integer? ] [ t >test-imm ] } - { [ dup src2>> vreg>insn ##load-integer? ] [ f >test-imm ] } - { [ dup diagonal? not ] [ drop f ] } - { [ dup src1>> vreg>insn ##and? ] [ simplify-test ] } - { [ dup src1>> vreg>insn ##and-imm? ] [ simplify-test-imm ] } + { [ dup src1>> vreg-immediate-comparand? ] [ t >test-imm ] } + { [ dup src2>> vreg-immediate-comparand? ] [ f >test-imm ] } + { [ dup diagonal? ] [ + { + { [ dup src1>> vreg>insn ##and? ] [ simplify-test ] } + { [ dup src1>> vreg>insn ##and-imm? ] [ simplify-test-imm ] } + [ drop f ] + } cond + ] } [ drop f ] } cond ; M: ##test-branch rewrite { - { [ dup src1>> vreg>insn ##load-integer? ] [ t >test-imm-branch ] } - { [ dup src2>> vreg>insn ##load-integer? ] [ f >test-imm-branch ] } - { [ dup diagonal? not ] [ drop f ] } - { [ dup src1>> vreg>insn ##and? ] [ simplify-test-branch ] } - { [ dup src1>> vreg>insn ##and-imm? ] [ simplify-test-imm-branch ] } + { [ dup src1>> vreg-immediate-comparand? ] [ t >test-imm-branch ] } + { [ dup src2>> vreg-immediate-comparand? ] [ f >test-imm-branch ] } + { [ dup diagonal? ] [ + { + { [ dup src1>> vreg>insn ##and? ] [ simplify-test-branch ] } + { [ dup src1>> vreg>insn ##and-imm? ] [ simplify-test-imm-branch ] } + [ drop f ] + } cond + ] } [ drop f ] } cond ; diff --git a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor index be387c3f32..ecf6da0894 100644 --- a/basis/compiler/cfg/value-numbering/value-numbering-tests.factor +++ b/basis/compiler/cfg/value-numbering/value-numbering-tests.factor @@ -1163,6 +1163,51 @@ cpu x86.32? [ } value-numbering-step ] unit-test +[ + { + T{ ##peek f 0 D 0 } + T{ ##load-integer f 1 10 } + T{ ##test-imm-branch f 0 10 cc= } + } +] [ + { + T{ ##peek f 0 D 0 } + T{ ##load-integer f 1 10 } + T{ ##test-branch f 1 0 cc= } + } value-numbering-step +] unit-test + +! Make sure the immediate fits +cpu x86.64? [ + [ + { + T{ ##peek f 0 D 0 } + T{ ##load-integer f 1 100000000000 } + T{ ##test f 2 1 0 cc= } + } + ] [ + { + T{ ##peek f 0 D 0 } + T{ ##load-integer f 1 100000000000 } + T{ ##test f 2 1 0 cc= } + } value-numbering-step + ] unit-test + + [ + { + T{ ##peek f 0 D 0 } + T{ ##load-integer f 1 100000000000 } + T{ ##test-branch f 1 0 cc= } + } + ] [ + { + T{ ##peek f 0 D 0 } + T{ ##load-integer f 1 100000000000 } + T{ ##test-branch f 1 0 cc= } + } value-numbering-step + ] unit-test +] when + ! Rewriting ##compare into ##test cpu x86? [ [