compiler.cfg.value-numbering: insert ##copy instructions for instructions whose expressions simplify. While subsequent usages are replaced with the instruction computing the simplified vreg locally, global usages may exist of the original instruction. In this case, the ##copy is not dead
parent
de73534424
commit
e0f6d89ff1
|
@ -20,13 +20,9 @@ IN: compiler.cfg.value-numbering.rewrite
|
||||||
|
|
||||||
! Outputs f to mean no change
|
! Outputs f to mean no change
|
||||||
|
|
||||||
GENERIC: rewrite* ( insn -- insn/f )
|
GENERIC: rewrite ( insn -- insn/f )
|
||||||
|
|
||||||
: rewrite ( insn -- insn' )
|
M: insn rewrite drop f ;
|
||||||
dup [ number-values ] [ rewrite* ] bi
|
|
||||||
[ rewrite ] [ ] ?if ;
|
|
||||||
|
|
||||||
M: insn rewrite* drop f ;
|
|
||||||
|
|
||||||
: ##branch-t? ( insn -- ? )
|
: ##branch-t? ( insn -- ? )
|
||||||
dup ##compare-imm-branch? [
|
dup ##compare-imm-branch? [
|
||||||
|
@ -123,7 +119,7 @@ ERROR: bad-comparison ;
|
||||||
: fold-compare-imm-branch ( insn -- insn/f )
|
: fold-compare-imm-branch ( insn -- insn/f )
|
||||||
(fold-compare-imm) fold-branch ;
|
(fold-compare-imm) fold-branch ;
|
||||||
|
|
||||||
M: ##compare-imm-branch rewrite*
|
M: ##compare-imm-branch rewrite
|
||||||
{
|
{
|
||||||
{ [ dup rewrite-boolean-comparison? ] [ rewrite-boolean-comparison ] }
|
{ [ dup rewrite-boolean-comparison? ] [ rewrite-boolean-comparison ] }
|
||||||
{ [ dup rewrite-tagged-comparison? ] [ rewrite-tagged-comparison ] }
|
{ [ dup rewrite-tagged-comparison? ] [ rewrite-tagged-comparison ] }
|
||||||
|
@ -154,7 +150,7 @@ M: ##compare-imm-branch rewrite*
|
||||||
: rewrite-self-compare-branch ( insn -- insn' )
|
: rewrite-self-compare-branch ( insn -- insn' )
|
||||||
(rewrite-self-compare) fold-branch ;
|
(rewrite-self-compare) fold-branch ;
|
||||||
|
|
||||||
M: ##compare-branch rewrite*
|
M: ##compare-branch rewrite
|
||||||
{
|
{
|
||||||
{ [ dup src1>> vreg-small-constant? ] [ t >compare-imm-branch ] }
|
{ [ dup src1>> vreg-small-constant? ] [ t >compare-imm-branch ] }
|
||||||
{ [ dup src2>> vreg-small-constant? ] [ f >compare-imm-branch ] }
|
{ [ dup src2>> vreg-small-constant? ] [ f >compare-imm-branch ] }
|
||||||
|
@ -185,7 +181,7 @@ M: ##compare-branch rewrite*
|
||||||
: rewrite-self-compare ( insn -- insn' )
|
: rewrite-self-compare ( insn -- insn' )
|
||||||
dup (rewrite-self-compare) >boolean-insn ;
|
dup (rewrite-self-compare) >boolean-insn ;
|
||||||
|
|
||||||
M: ##compare rewrite*
|
M: ##compare rewrite
|
||||||
{
|
{
|
||||||
{ [ dup src1>> vreg-small-constant? ] [ t >compare-imm ] }
|
{ [ dup src1>> vreg-small-constant? ] [ t >compare-imm ] }
|
||||||
{ [ dup src2>> vreg-small-constant? ] [ f >compare-imm ] }
|
{ [ dup src2>> vreg-small-constant? ] [ f >compare-imm ] }
|
||||||
|
@ -196,7 +192,7 @@ M: ##compare rewrite*
|
||||||
: fold-compare-imm ( insn -- insn' )
|
: fold-compare-imm ( insn -- insn' )
|
||||||
dup (fold-compare-imm) >boolean-insn ;
|
dup (fold-compare-imm) >boolean-insn ;
|
||||||
|
|
||||||
M: ##compare-imm rewrite*
|
M: ##compare-imm rewrite
|
||||||
{
|
{
|
||||||
{ [ dup rewrite-redundant-comparison? ] [ rewrite-redundant-comparison ] }
|
{ [ dup rewrite-redundant-comparison? ] [ rewrite-redundant-comparison ] }
|
||||||
{ [ dup rewrite-tagged-comparison? ] [ rewrite-tagged-comparison ] }
|
{ [ dup rewrite-tagged-comparison? ] [ rewrite-tagged-comparison ] }
|
||||||
|
@ -238,7 +234,7 @@ M: ##shl-imm constant-fold* drop shift ;
|
||||||
] dip
|
] dip
|
||||||
over small-enough? [ new-insn ] [ 2drop 2drop f ] if ; inline
|
over small-enough? [ new-insn ] [ 2drop 2drop f ] if ; inline
|
||||||
|
|
||||||
M: ##add-imm rewrite*
|
M: ##add-imm rewrite
|
||||||
{
|
{
|
||||||
{ [ dup constant-fold? ] [ constant-fold ] }
|
{ [ dup constant-fold? ] [ constant-fold ] }
|
||||||
{ [ dup reassociate? ] [ \ ##add-imm reassociate ] }
|
{ [ dup reassociate? ] [ \ ##add-imm reassociate ] }
|
||||||
|
@ -249,7 +245,7 @@ M: ##add-imm rewrite*
|
||||||
[ dst>> ] [ src1>> ] [ src2>> neg ] tri dup small-enough?
|
[ dst>> ] [ src1>> ] [ src2>> neg ] tri dup small-enough?
|
||||||
[ \ ##add-imm new-insn ] [ 3drop f ] if ;
|
[ \ ##add-imm new-insn ] [ 3drop f ] if ;
|
||||||
|
|
||||||
M: ##sub-imm rewrite*
|
M: ##sub-imm rewrite
|
||||||
{
|
{
|
||||||
{ [ dup constant-fold? ] [ constant-fold ] }
|
{ [ dup constant-fold? ] [ constant-fold ] }
|
||||||
[ sub-imm>add-imm ]
|
[ sub-imm>add-imm ]
|
||||||
|
@ -261,7 +257,7 @@ M: ##sub-imm rewrite*
|
||||||
: strength-reduce-mul? ( insn -- ? )
|
: strength-reduce-mul? ( insn -- ? )
|
||||||
src2>> power-of-2? ;
|
src2>> power-of-2? ;
|
||||||
|
|
||||||
M: ##mul-imm rewrite*
|
M: ##mul-imm rewrite
|
||||||
{
|
{
|
||||||
{ [ dup constant-fold? ] [ constant-fold ] }
|
{ [ dup constant-fold? ] [ constant-fold ] }
|
||||||
{ [ dup strength-reduce-mul? ] [ strength-reduce-mul ] }
|
{ [ dup strength-reduce-mul? ] [ strength-reduce-mul ] }
|
||||||
|
@ -269,40 +265,40 @@ M: ##mul-imm rewrite*
|
||||||
[ drop f ]
|
[ drop f ]
|
||||||
} cond ;
|
} cond ;
|
||||||
|
|
||||||
M: ##and-imm rewrite*
|
M: ##and-imm rewrite
|
||||||
{
|
{
|
||||||
{ [ dup constant-fold? ] [ constant-fold ] }
|
{ [ dup constant-fold? ] [ constant-fold ] }
|
||||||
{ [ dup reassociate? ] [ \ ##and-imm reassociate ] }
|
{ [ dup reassociate? ] [ \ ##and-imm reassociate ] }
|
||||||
[ drop f ]
|
[ drop f ]
|
||||||
} cond ;
|
} cond ;
|
||||||
|
|
||||||
M: ##or-imm rewrite*
|
M: ##or-imm rewrite
|
||||||
{
|
{
|
||||||
{ [ dup constant-fold? ] [ constant-fold ] }
|
{ [ dup constant-fold? ] [ constant-fold ] }
|
||||||
{ [ dup reassociate? ] [ \ ##or-imm reassociate ] }
|
{ [ dup reassociate? ] [ \ ##or-imm reassociate ] }
|
||||||
[ drop f ]
|
[ drop f ]
|
||||||
} cond ;
|
} cond ;
|
||||||
|
|
||||||
M: ##xor-imm rewrite*
|
M: ##xor-imm rewrite
|
||||||
{
|
{
|
||||||
{ [ dup constant-fold? ] [ constant-fold ] }
|
{ [ dup constant-fold? ] [ constant-fold ] }
|
||||||
{ [ dup reassociate? ] [ \ ##xor-imm reassociate ] }
|
{ [ dup reassociate? ] [ \ ##xor-imm reassociate ] }
|
||||||
[ drop f ]
|
[ drop f ]
|
||||||
} cond ;
|
} cond ;
|
||||||
|
|
||||||
M: ##shl-imm rewrite*
|
M: ##shl-imm rewrite
|
||||||
{
|
{
|
||||||
{ [ dup constant-fold? ] [ constant-fold ] }
|
{ [ dup constant-fold? ] [ constant-fold ] }
|
||||||
[ drop f ]
|
[ drop f ]
|
||||||
} cond ;
|
} cond ;
|
||||||
|
|
||||||
M: ##shr-imm rewrite*
|
M: ##shr-imm rewrite
|
||||||
{
|
{
|
||||||
{ [ dup constant-fold? ] [ constant-fold ] }
|
{ [ dup constant-fold? ] [ constant-fold ] }
|
||||||
[ drop f ]
|
[ drop f ]
|
||||||
} cond ;
|
} cond ;
|
||||||
|
|
||||||
M: ##sar-imm rewrite*
|
M: ##sar-imm rewrite
|
||||||
{
|
{
|
||||||
{ [ dup constant-fold? ] [ constant-fold ] }
|
{ [ dup constant-fold? ] [ constant-fold ] }
|
||||||
[ drop f ]
|
[ drop f ]
|
||||||
|
@ -327,7 +323,7 @@ M: ##sar-imm rewrite*
|
||||||
[ 2drop f ]
|
[ 2drop f ]
|
||||||
} cond ; inline
|
} cond ; inline
|
||||||
|
|
||||||
M: ##add rewrite* \ ##add-imm rewrite-arithmetic-commutative ;
|
M: ##add rewrite \ ##add-imm rewrite-arithmetic-commutative ;
|
||||||
|
|
||||||
: subtraction-identity? ( insn -- ? )
|
: subtraction-identity? ( insn -- ? )
|
||||||
[ src1>> ] [ src2>> ] bi [ vreg>vn ] bi@ eq? ;
|
[ src1>> ] [ src2>> ] bi [ vreg>vn ] bi@ eq? ;
|
||||||
|
@ -335,22 +331,22 @@ M: ##add rewrite* \ ##add-imm rewrite-arithmetic-commutative ;
|
||||||
: rewrite-subtraction-identity ( insn -- insn' )
|
: rewrite-subtraction-identity ( insn -- insn' )
|
||||||
dst>> 0 \ ##load-immediate new-insn ;
|
dst>> 0 \ ##load-immediate new-insn ;
|
||||||
|
|
||||||
M: ##sub rewrite*
|
M: ##sub rewrite
|
||||||
{
|
{
|
||||||
{ [ dup subtraction-identity? ] [ rewrite-subtraction-identity ] }
|
{ [ dup subtraction-identity? ] [ rewrite-subtraction-identity ] }
|
||||||
[ \ ##sub-imm rewrite-arithmetic ]
|
[ \ ##sub-imm rewrite-arithmetic ]
|
||||||
} cond ;
|
} cond ;
|
||||||
|
|
||||||
M: ##mul rewrite* \ ##mul-imm rewrite-arithmetic-commutative ;
|
M: ##mul rewrite \ ##mul-imm rewrite-arithmetic-commutative ;
|
||||||
|
|
||||||
M: ##and rewrite* \ ##and-imm rewrite-arithmetic-commutative ;
|
M: ##and rewrite \ ##and-imm rewrite-arithmetic-commutative ;
|
||||||
|
|
||||||
M: ##or rewrite* \ ##or-imm rewrite-arithmetic-commutative ;
|
M: ##or rewrite \ ##or-imm rewrite-arithmetic-commutative ;
|
||||||
|
|
||||||
M: ##xor rewrite* \ ##xor-imm rewrite-arithmetic-commutative ;
|
M: ##xor rewrite \ ##xor-imm rewrite-arithmetic-commutative ;
|
||||||
|
|
||||||
M: ##shl rewrite* \ ##shl-imm rewrite-arithmetic ;
|
M: ##shl rewrite \ ##shl-imm rewrite-arithmetic ;
|
||||||
|
|
||||||
M: ##shr rewrite* \ ##shr-imm rewrite-arithmetic ;
|
M: ##shr rewrite \ ##shr-imm rewrite-arithmetic ;
|
||||||
|
|
||||||
M: ##sar rewrite* \ ##sar-imm rewrite-arithmetic ;
|
M: ##sar rewrite \ ##sar-imm rewrite-arithmetic ;
|
||||||
|
|
|
@ -120,14 +120,12 @@ M: binary-expr simplify*
|
||||||
|
|
||||||
M: expr simplify* drop f ;
|
M: expr simplify* drop f ;
|
||||||
|
|
||||||
: simplify ( expr -- vn )
|
: simplify ( expr -- simplified? vn )
|
||||||
dup simplify* {
|
dup simplify* {
|
||||||
{ [ dup not ] [ drop expr>vn ] }
|
{ [ dup not ] [ drop expr>vn f ] }
|
||||||
{ [ dup expr? ] [ expr>vn nip ] }
|
{ [ dup expr? ] [ expr>vn nip t ] }
|
||||||
{ [ dup integer? ] [ nip ] }
|
{ [ dup integer? ] [ nip t ] }
|
||||||
} cond ;
|
} cond swap ;
|
||||||
|
|
||||||
GENERIC: number-values ( insn -- )
|
: number-values ( insn -- simplified? )
|
||||||
|
[ >expr simplify ] [ dst>> set-vn ] bi ;
|
||||||
M: ##flushable number-values [ >expr simplify ] [ dst>> ] bi set-vn ;
|
|
||||||
M: insn number-values drop ;
|
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
! Copyright (C) 2008, 2009 Slava Pestov.
|
! Copyright (C) 2008, 2009 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: namespaces assocs biassocs classes kernel math accessors
|
USING: namespaces assocs kernel accessors
|
||||||
sorting sets sequences fry
|
sorting sets sequences
|
||||||
compiler.cfg
|
compiler.cfg
|
||||||
compiler.cfg.rpo
|
compiler.cfg.rpo
|
||||||
compiler.cfg.renaming
|
compiler.cfg.instructions
|
||||||
compiler.cfg.value-numbering.graph
|
compiler.cfg.value-numbering.graph
|
||||||
compiler.cfg.value-numbering.expressions
|
compiler.cfg.value-numbering.expressions
|
||||||
compiler.cfg.value-numbering.simplify
|
compiler.cfg.value-numbering.simplify
|
||||||
|
@ -12,20 +12,27 @@ compiler.cfg.value-numbering.rewrite ;
|
||||||
IN: compiler.cfg.value-numbering
|
IN: compiler.cfg.value-numbering
|
||||||
|
|
||||||
! Local value numbering. Predecessors must be recomputed after this
|
! Local value numbering. Predecessors must be recomputed after this
|
||||||
: vreg>vreg-mapping ( -- assoc )
|
: >copy ( insn -- ##copy )
|
||||||
vregs>vns get [ keys ] keep
|
dst>> dup vreg>vn vn>vreg \ ##copy new-insn ;
|
||||||
'[ dup _ [ at ] [ value-at ] bi ] H{ } map>assoc ;
|
|
||||||
|
|
||||||
: rename-uses ( insns -- )
|
: rewrite-loop ( insn -- insn' )
|
||||||
vreg>vreg-mapping renamings [
|
dup rewrite [ rewrite-loop ] [ ] ?if ;
|
||||||
[ rename-insn-uses ] each
|
|
||||||
] with-variable ;
|
GENERIC: process-instruction ( insn -- insn' )
|
||||||
|
|
||||||
|
M: ##flushable process-instruction
|
||||||
|
dup rewrite
|
||||||
|
[ process-instruction ]
|
||||||
|
[ dup number-values [ >copy ] when ] ?if ;
|
||||||
|
|
||||||
|
M: insn process-instruction
|
||||||
|
dup rewrite
|
||||||
|
[ process-instruction ] [ ] ?if ;
|
||||||
|
|
||||||
: value-numbering-step ( insns -- insns' )
|
: value-numbering-step ( insns -- insns' )
|
||||||
init-value-graph
|
init-value-graph
|
||||||
init-expressions
|
init-expressions
|
||||||
[ rewrite ] map
|
[ process-instruction ] map ;
|
||||||
dup rename-uses ;
|
|
||||||
|
|
||||||
: value-numbering ( cfg -- cfg' )
|
: value-numbering ( cfg -- cfg' )
|
||||||
[ value-numbering-step ] local-optimization cfg-changed ;
|
[ value-numbering-step ] local-optimization cfg-changed ;
|
||||||
|
|
Loading…
Reference in New Issue