compiler.cfg.value-numbering.rewrite: fix ##compare-imm rewrite rule
parent
c00af97fa1
commit
fb488025aa
|
@ -199,6 +199,16 @@ SYMBOL: cc/=
|
||||||
{ cc/= cc= }
|
{ cc/= cc= }
|
||||||
} at ;
|
} at ;
|
||||||
|
|
||||||
|
: swap-cc ( cc -- cc' )
|
||||||
|
H{
|
||||||
|
{ cc< cc> }
|
||||||
|
{ cc<= cc>= }
|
||||||
|
{ cc> cc< }
|
||||||
|
{ cc>= cc<= }
|
||||||
|
{ cc= cc= }
|
||||||
|
{ cc/= cc/= }
|
||||||
|
} at ;
|
||||||
|
|
||||||
: evaluate-cc ( result cc -- ? )
|
: evaluate-cc ( result cc -- ? )
|
||||||
H{
|
H{
|
||||||
{ cc< { +lt+ } }
|
{ cc< { +lt+ } }
|
||||||
|
|
|
@ -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.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors combinators combinators.short-circuit
|
USING: accessors locals combinators combinators.short-circuit arrays
|
||||||
arrays compiler.cfg.hats compiler.cfg.instructions
|
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.expressions
|
||||||
compiler.cfg.value-numbering.graph
|
compiler.cfg.value-numbering.graph
|
||||||
compiler.cfg.value-numbering.simplify fry kernel layouts math
|
compiler.cfg.value-numbering.simplify ;
|
||||||
namespaces sequences cpu.architecture math.bitwise locals ;
|
|
||||||
IN: compiler.cfg.value-numbering.rewrite
|
IN: compiler.cfg.value-numbering.rewrite
|
||||||
|
|
||||||
GENERIC: rewrite ( insn -- insn' )
|
GENERIC: rewrite ( insn -- insn' )
|
||||||
|
@ -70,16 +70,11 @@ M: ##compare-imm-branch rewrite
|
||||||
dup rewrite-tagged-comparison? [ rewrite-tagged-comparison ] when
|
dup rewrite-tagged-comparison? [ rewrite-tagged-comparison ] when
|
||||||
] when ;
|
] when ;
|
||||||
|
|
||||||
: >compare-imm ( insn swap? -- insn' )
|
:: >compare-imm ( insn swap? -- insn' )
|
||||||
[
|
insn dst>>
|
||||||
{
|
insn src1>>
|
||||||
[ dst>> ]
|
insn src2>> swap? [ swap ] when vreg>constant
|
||||||
[ src1>> ]
|
insn cc>> swap? [ swap-cc ] when
|
||||||
[ src2>> ]
|
|
||||||
[ cc>> ]
|
|
||||||
} cleave
|
|
||||||
] dip [ [ swap ] [ ] bi* ] when
|
|
||||||
[ vreg>constant ] dip
|
|
||||||
i \ ##compare-imm new-insn ; inline
|
i \ ##compare-imm new-insn ; inline
|
||||||
|
|
||||||
M: ##compare rewrite
|
M: ##compare rewrite
|
||||||
|
@ -90,6 +85,20 @@ M: ##compare rewrite
|
||||||
[ drop ]
|
[ drop ]
|
||||||
} case ;
|
} 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 -- ? )
|
: rewrite-redundant-comparison? ( insn -- ? )
|
||||||
{
|
{
|
||||||
[ src1>> vreg>expr compare-expr? ]
|
[ src1>> vreg>expr compare-expr? ]
|
||||||
|
|
|
@ -311,3 +311,7 @@ M: cucumber equal? "The cucumber has no equal" throw ;
|
||||||
] [
|
] [
|
||||||
[ { 1 2 3 } "x" "y" linear-scan-regression ] { } make
|
[ { 1 2 3 } "x" "y" linear-scan-regression ] { } make
|
||||||
] unit-test
|
] 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
|
Loading…
Reference in New Issue