1 ! Copyright (C) 2008, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel accessors combinators classes math layouts
4 compiler.cfg.instructions
5 compiler.cfg.value-numbering.graph
6 compiler.cfg.value-numbering.expressions ;
7 IN: compiler.cfg.value-numbering.simplify
9 ! Return value of f means we didn't simplify.
10 GENERIC: simplify* ( expr -- vn/expr/f )
12 M: copy-expr simplify* src>> ;
14 : simplify-unbox-alien ( expr -- vn/expr/f )
15 src>> vn>expr dup box-alien-expr? [ src>> ] [ drop f ] if ;
17 M: unbox-alien-expr simplify* simplify-unbox-alien ;
19 M: unbox-any-c-ptr-expr simplify* simplify-unbox-alien ;
21 : expr-zero? ( expr -- ? ) T{ constant-expr f 0 } = ; inline
23 : expr-one? ( expr -- ? ) T{ constant-expr f 1 } = ; inline
25 : >binary-expr< ( expr -- in1 in2 )
26 [ src1>> vn>expr ] [ src2>> vn>expr ] bi ; inline
28 : simplify-add ( expr -- vn/expr/f )
30 { [ over expr-zero? ] [ nip ] }
31 { [ dup expr-zero? ] [ drop ] }
35 M: add-expr simplify* simplify-add ;
36 M: add-imm-expr simplify* simplify-add ;
38 : simplify-sub ( expr -- vn/expr/f )
40 { [ dup expr-zero? ] [ drop ] }
44 M: sub-expr simplify* simplify-sub ;
45 M: sub-imm-expr simplify* simplify-sub ;
47 : simplify-mul ( expr -- vn/expr/f )
49 { [ over expr-one? ] [ drop ] }
50 { [ dup expr-one? ] [ drop ] }
54 M: mul-expr simplify* simplify-mul ;
55 M: mul-imm-expr simplify* simplify-mul ;
57 : simplify-and ( expr -- vn/expr/f )
59 { [ 2dup eq? ] [ drop ] }
63 M: and-expr simplify* simplify-and ;
64 M: and-imm-expr simplify* simplify-and ;
66 : simplify-or ( expr -- vn/expr/f )
68 { [ 2dup eq? ] [ drop ] }
69 { [ over expr-zero? ] [ nip ] }
70 { [ dup expr-zero? ] [ drop ] }
74 M: or-expr simplify* simplify-or ;
75 M: or-imm-expr simplify* simplify-or ;
77 : simplify-xor ( expr -- vn/expr/f )
79 { [ over expr-zero? ] [ nip ] }
80 { [ dup expr-zero? ] [ drop ] }
84 M: xor-expr simplify* simplify-xor ;
85 M: xor-imm-expr simplify* simplify-xor ;
87 : useless-shr? ( in1 in2 -- ? )
89 [ [ src2>> ] [ expr>vn ] bi* = ] [ 2drop f ] if ; inline
91 : simplify-shr ( expr -- vn/expr/f )
93 { [ 2dup useless-shr? ] [ drop src1>> ] }
94 { [ dup expr-zero? ] [ drop ] }
98 M: shr-expr simplify* simplify-shr ;
99 M: shr-imm-expr simplify* simplify-shr ;
101 : simplify-shl ( expr -- vn/expr/f )
103 { [ dup expr-zero? ] [ drop ] }
107 M: shl-expr simplify* simplify-shl ;
108 M: shl-imm-expr simplify* simplify-shl ;
110 M: box-displaced-alien-expr simplify*
111 [ base>> ] [ displacement>> ] bi {
112 { [ dup vn>expr expr-zero? ] [ drop ] }
116 M: expr simplify* drop f ;
118 : simplify ( expr -- vn )
120 { [ dup not ] [ drop expr>vn ] }
121 { [ dup expr? ] [ expr>vn nip ] }
122 { [ dup integer? ] [ nip ] }
125 : number-values ( insn -- )
126 [ >expr simplify ] [ dst>> ] bi set-vn ;