compiler.cfg.value-numbering: identify VNs with their representative vregs, eliminating the vn>vreg hash
parent
edaf59bf46
commit
ef8094e3b3
|
@ -77,13 +77,7 @@ M: reference-expr equal?
|
||||||
M: reference-expr hashcode*
|
M: reference-expr hashcode*
|
||||||
nip value>> dup float? [ double>bits ] [ identity-hashcode ] if ;
|
nip value>> dup float? [ double>bits ] [ identity-hashcode ] if ;
|
||||||
|
|
||||||
! Expressions whose values are inputs to the basic block.
|
M: insn >expr drop input-expr-counter counter neg ;
|
||||||
TUPLE: input-expr n ;
|
|
||||||
|
|
||||||
: next-input-expr ( -- expr )
|
|
||||||
input-expr-counter counter input-expr boa ;
|
|
||||||
|
|
||||||
M: insn >expr drop next-input-expr ;
|
|
||||||
|
|
||||||
M: ##copy >expr "Fail" throw ;
|
M: ##copy >expr "Fail" throw ;
|
||||||
|
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
! Copyright (C) 2008, 2010 Slava Pestov.
|
! Copyright (C) 2008, 2010 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors kernel math namespaces assocs biassocs ;
|
USING: accessors kernel math namespaces assocs ;
|
||||||
IN: compiler.cfg.value-numbering.graph
|
IN: compiler.cfg.value-numbering.graph
|
||||||
|
|
||||||
! Value numbers are negative, to catch confusion with vregs
|
|
||||||
SYMBOL: vn-counter
|
|
||||||
|
|
||||||
SYMBOL: input-expr-counter
|
SYMBOL: input-expr-counter
|
||||||
|
|
||||||
: next-vn ( -- vn ) vn-counter [ 1 - dup ] change ;
|
! assoc mapping vregs to value numbers
|
||||||
|
! this is the identity on canonical representatives
|
||||||
|
SYMBOL: vregs>vns
|
||||||
|
|
||||||
! assoc mapping expressions to value numbers
|
! assoc mapping expressions to value numbers
|
||||||
SYMBOL: exprs>vns
|
SYMBOL: exprs>vns
|
||||||
|
@ -18,21 +17,14 @@ SYMBOL: vns>insns
|
||||||
|
|
||||||
: vn>insn ( vn -- insn ) vns>insns get at ;
|
: vn>insn ( vn -- insn ) vns>insns get at ;
|
||||||
|
|
||||||
! biassocs mapping vregs to value numbers, and value numbers to
|
: vreg>vn ( vreg -- vn ) vregs>vns get [ ] cache ;
|
||||||
! their primary vregs
|
|
||||||
SYMBOL: vregs>vns
|
|
||||||
|
|
||||||
: vreg>vn ( vreg -- vn ) vregs>vns get [ drop next-vn ] cache ;
|
|
||||||
|
|
||||||
: vn>vreg ( vn -- vreg ) vregs>vns get value-at ;
|
|
||||||
|
|
||||||
: set-vn ( vn vreg -- ) vregs>vns get set-at ;
|
: set-vn ( vn vreg -- ) vregs>vns get set-at ;
|
||||||
|
|
||||||
: vreg>insn ( vreg -- insn ) vreg>vn vn>insn ; inline
|
: vreg>insn ( vreg -- insn ) vreg>vn vn>insn ;
|
||||||
|
|
||||||
: init-value-graph ( -- )
|
: init-value-graph ( -- )
|
||||||
0 vn-counter set
|
|
||||||
0 input-expr-counter set
|
0 input-expr-counter set
|
||||||
<bihash> vregs>vns set
|
H{ } clone vregs>vns set
|
||||||
H{ } clone exprs>vns set
|
H{ } clone exprs>vns set
|
||||||
H{ } clone vns>insns set ;
|
H{ } clone vns>insns set ;
|
||||||
|
|
|
@ -21,11 +21,11 @@ IN: compiler.cfg.value-numbering
|
||||||
GENERIC: process-instruction ( insn -- insn' )
|
GENERIC: process-instruction ( insn -- insn' )
|
||||||
|
|
||||||
: redundant-instruction ( insn vn -- insn' )
|
: redundant-instruction ( insn vn -- insn' )
|
||||||
[ dst>> ] dip [ swap set-vn ] [ vn>vreg <copy> ] 2bi ;
|
[ dst>> ] dip [ swap set-vn ] [ <copy> ] 2bi ;
|
||||||
|
|
||||||
:: useful-instruction ( insn expr -- insn' )
|
:: useful-instruction ( insn expr -- insn' )
|
||||||
next-vn :> vn
|
insn dst>> :> vn
|
||||||
vn insn dst>> vregs>vns get set-at
|
vn vn vregs>vns get set-at
|
||||||
vn expr exprs>vns get set-at
|
vn expr exprs>vns get set-at
|
||||||
insn vn vns>insns get set-at
|
insn vn vns>insns get set-at
|
||||||
insn ;
|
insn ;
|
||||||
|
|
Loading…
Reference in New Issue