factor/basis/compiler/cfg/value-numbering/simplify/simplify.factor

154 lines
3.9 KiB
Factor
Raw Normal View History

! Copyright (C) 2008, 2009 Slava Pestov.
2008-10-22 22:59:07 -04:00
! See http://factorcode.org/license.txt for BSD license.
USING: kernel accessors combinators classes math layouts
sequences math.vectors.simd.intrinsics
2008-10-22 22:59:07 -04:00
compiler.cfg.instructions
compiler.cfg.value-numbering.graph
compiler.cfg.value-numbering.expressions ;
2008-10-22 22:59:07 -04:00
IN: compiler.cfg.value-numbering.simplify
! Return value of f means we didn't simplify.
GENERIC: simplify* ( expr -- vn/expr/f )
M: copy-expr simplify* src>> ;
2008-10-22 22:59:07 -04:00
: simplify-unbox-alien ( expr -- vn/expr/f )
src>> vn>expr dup box-alien-expr? [ src>> ] [ drop f ] if ;
M: unbox-alien-expr simplify* simplify-unbox-alien ;
M: unbox-any-c-ptr-expr simplify* simplify-unbox-alien ;
2008-10-23 06:27:54 -04:00
: expr-zero? ( expr -- ? ) T{ constant-expr f 0 } = ; inline
2008-10-23 06:27:54 -04:00
: expr-one? ( expr -- ? ) T{ constant-expr f 1 } = ; inline
: expr-neg-one? ( expr -- ? ) T{ constant-expr f -1 } = ; inline
: >unary-expr< ( expr -- in ) src>> vn>expr ; inline
M: neg-expr simplify*
>unary-expr< {
{ [ dup neg-expr? ] [ src>> ] }
[ drop f ]
} cond ;
M: not-expr simplify*
>unary-expr< {
{ [ dup not-expr? ] [ src>> ] }
[ drop f ]
} cond ;
2008-10-23 06:27:54 -04:00
: >binary-expr< ( expr -- in1 in2 )
[ src1>> vn>expr ] [ src2>> vn>expr ] bi ; inline
2008-10-23 06:27:54 -04:00
: simplify-add ( expr -- vn/expr/f )
>binary-expr< {
{ [ over expr-zero? ] [ nip ] }
{ [ dup expr-zero? ] [ drop ] }
[ 2drop f ]
} cond ; inline
M: add-expr simplify* simplify-add ;
M: add-imm-expr simplify* simplify-add ;
2009-07-02 12:33:15 -04:00
: simplify-sub ( expr -- vn/expr/f )
>binary-expr< {
{ [ dup expr-zero? ] [ drop ] }
[ 2drop f ]
} cond ; inline
M: sub-expr simplify* simplify-sub ;
M: sub-imm-expr simplify* simplify-sub ;
: simplify-mul ( expr -- vn/expr/f )
>binary-expr< {
{ [ over expr-one? ] [ drop ] }
{ [ dup expr-one? ] [ drop ] }
[ 2drop f ]
} cond ; inline
M: mul-expr simplify* simplify-mul ;
M: mul-imm-expr simplify* simplify-mul ;
: simplify-and ( expr -- vn/expr/f )
>binary-expr< {
{ [ 2dup eq? ] [ drop ] }
[ 2drop f ]
} cond ; inline
M: and-expr simplify* simplify-and ;
M: and-imm-expr simplify* simplify-and ;
: simplify-or ( expr -- vn/expr/f )
>binary-expr< {
{ [ 2dup eq? ] [ drop ] }
{ [ over expr-zero? ] [ nip ] }
{ [ dup expr-zero? ] [ drop ] }
[ 2drop f ]
} cond ; inline
M: or-expr simplify* simplify-or ;
M: or-imm-expr simplify* simplify-or ;
: simplify-xor ( expr -- vn/expr/f )
>binary-expr< {
{ [ over expr-zero? ] [ nip ] }
{ [ dup expr-zero? ] [ drop ] }
[ 2drop f ]
} cond ; inline
M: xor-expr simplify* simplify-xor ;
M: xor-imm-expr simplify* simplify-xor ;
: useless-shr? ( in1 in2 -- ? )
over shl-imm-expr?
[ [ src2>> ] [ expr>vn ] bi* = ] [ 2drop f ] if ; inline
2008-10-23 06:27:54 -04:00
: simplify-shr ( expr -- vn/expr/f )
>binary-expr< {
{ [ 2dup useless-shr? ] [ drop src1>> ] }
{ [ dup expr-zero? ] [ drop ] }
[ 2drop f ]
} cond ; inline
M: shr-expr simplify* simplify-shr ;
M: shr-imm-expr simplify* simplify-shr ;
: simplify-shl ( expr -- vn/expr/f )
>binary-expr< {
{ [ dup expr-zero? ] [ drop ] }
[ 2drop f ]
} cond ; inline
2008-10-23 06:27:54 -04:00
M: shl-expr simplify* simplify-shl ;
M: shl-imm-expr simplify* simplify-shl ;
2008-10-22 22:59:07 -04:00
M: box-displaced-alien-expr simplify*
[ base>> ] [ displacement>> ] bi {
{ [ dup vn>expr expr-zero? ] [ drop ] }
[ 2drop f ]
} cond ;
M: scalar>vector-expr simplify*
src>> vn>expr {
{ [ dup vector>scalar-expr? ] [ src>> ] }
[ drop f ]
} cond ;
M: shuffle-vector-imm-expr simplify*
[ src>> ] [ shuffle>> ] [ rep>> rep-components iota ] tri
sequence= [ drop f ] unless ;
2008-10-22 22:59:07 -04:00
M: expr simplify* drop f ;
2009-07-24 07:08:07 -04:00
: simplify ( expr -- vn )
2008-10-22 22:59:07 -04:00
dup simplify* {
2009-07-24 07:08:07 -04:00
{ [ dup not ] [ drop expr>vn ] }
{ [ dup expr? ] [ expr>vn nip ] }
{ [ dup integer? ] [ nip ] }
} cond ;
2008-10-23 03:49:26 -04:00
2009-07-24 07:08:07 -04:00
: number-values ( insn -- )
[ >expr simplify ] [ dst>> ] bi set-vn ;