From fb488025aa77c93ef4649a161b1794cf23170545 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sat, 4 Jul 2009 02:50:50 -0500 Subject: [PATCH] compiler.cfg.value-numbering.rewrite: fix ##compare-imm rewrite rule --- .../cfg/instructions/instructions.factor | 10 +++++ .../value-numbering/rewrite/rewrite.factor | 39 ++++++++++++------- basis/compiler/tests/codegen.factor | 6 ++- 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/basis/compiler/cfg/instructions/instructions.factor b/basis/compiler/cfg/instructions/instructions.factor index a2b12300f7..1a1b2fd65c 100644 --- a/basis/compiler/cfg/instructions/instructions.factor +++ b/basis/compiler/cfg/instructions/instructions.factor @@ -199,6 +199,16 @@ SYMBOL: cc/= { cc/= cc= } } at ; +: swap-cc ( cc -- cc' ) + H{ + { cc< cc> } + { cc<= cc>= } + { cc> cc< } + { cc>= cc<= } + { cc= cc= } + { cc/= cc/= } + } at ; + : evaluate-cc ( result cc -- ? ) H{ { cc< { +lt+ } } diff --git a/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor b/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor index 9fb6e66e9f..8a435135c7 100755 --- a/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor +++ b/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor @@ -1,11 +1,11 @@ -! Copyright (C) 2008 Slava Pestov, Doug Coleman. +! Copyright (C) 2008, 2009 Slava Pestov, Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. -USING: accessors combinators combinators.short-circuit -arrays compiler.cfg.hats compiler.cfg.instructions +USING: accessors locals combinators combinators.short-circuit arrays +fry kernel layouts math namespaces sequences cpu.architecture +math.bitwise compiler.cfg.hats compiler.cfg.instructions compiler.cfg.value-numbering.expressions compiler.cfg.value-numbering.graph -compiler.cfg.value-numbering.simplify fry kernel layouts math -namespaces sequences cpu.architecture math.bitwise locals ; +compiler.cfg.value-numbering.simplify ; IN: compiler.cfg.value-numbering.rewrite GENERIC: rewrite ( insn -- insn' ) @@ -70,16 +70,11 @@ M: ##compare-imm-branch rewrite dup rewrite-tagged-comparison? [ rewrite-tagged-comparison ] when ] when ; -: >compare-imm ( insn swap? -- insn' ) - [ - { - [ dst>> ] - [ src1>> ] - [ src2>> ] - [ cc>> ] - } cleave - ] dip [ [ swap ] [ ] bi* ] when - [ vreg>constant ] dip +:: >compare-imm ( insn swap? -- insn' ) + insn dst>> + insn src1>> + insn src2>> swap? [ swap ] when vreg>constant + insn cc>> swap? [ swap-cc ] when i \ ##compare-imm new-insn ; inline M: ##compare rewrite @@ -90,6 +85,20 @@ M: ##compare rewrite [ drop ] } case ; +:: >compare-imm-branch ( insn swap? -- insn' ) + insn src1>> + insn src2>> swap? [ swap ] when vreg>constant + insn cc>> swap? [ swap-cc ] when + \ ##compare-imm-branch new-insn ; inline + +M: ##compare-branch rewrite + dup [ src1>> ] [ src2>> ] bi + [ vreg>expr constant-expr? ] bi@ 2array { + { { f t } [ f >compare-imm-branch ] } + { { t f } [ t >compare-imm-branch ] } + [ drop ] + } case ; + : rewrite-redundant-comparison? ( insn -- ? ) { [ src1>> vreg>expr compare-expr? ] diff --git a/basis/compiler/tests/codegen.factor b/basis/compiler/tests/codegen.factor index 36ee5eb94d..82da31b5fe 100644 --- a/basis/compiler/tests/codegen.factor +++ b/basis/compiler/tests/codegen.factor @@ -310,4 +310,8 @@ M: cucumber equal? "The cucumber has no equal" throw ; } ] [ [ { 1 2 3 } "x" "y" linear-scan-regression ] { } make -] unit-test \ No newline at end of file +] unit-test + +! Regression from Doug's value numbering changes +[ t ] [ 2 [ 1 swap fixnum< ] compile-call ] unit-test +[ 3 ] [ 2 [ 1 swap fixnum< [ 3 ] [ 4 ] if ] compile-call ] unit-test \ No newline at end of file