diff --git a/basis/compiler/cfg/value-numbering/expressions/expressions.factor b/basis/compiler/cfg/value-numbering/expressions/expressions.factor index ffd2efbd21..087aedf50d 100644 --- a/basis/compiler/cfg/value-numbering/expressions/expressions.factor +++ b/basis/compiler/cfg/value-numbering/expressions/expressions.factor @@ -77,13 +77,7 @@ M: reference-expr equal? M: reference-expr hashcode* nip value>> dup float? [ double>bits ] [ identity-hashcode ] if ; -! Expressions whose values are inputs to the basic block. -TUPLE: input-expr n ; - -: next-input-expr ( -- expr ) - input-expr-counter counter input-expr boa ; - -M: insn >expr drop next-input-expr ; +M: insn >expr drop input-expr-counter counter neg ; M: ##copy >expr "Fail" throw ; diff --git a/basis/compiler/cfg/value-numbering/graph/graph.factor b/basis/compiler/cfg/value-numbering/graph/graph.factor index bef4956f5e..1ea1a52d02 100644 --- a/basis/compiler/cfg/value-numbering/graph/graph.factor +++ b/basis/compiler/cfg/value-numbering/graph/graph.factor @@ -1,14 +1,13 @@ ! Copyright (C) 2008, 2010 Slava Pestov. ! 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 -! Value numbers are negative, to catch confusion with vregs -SYMBOL: vn-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 SYMBOL: exprs>vns @@ -18,21 +17,14 @@ SYMBOL: vns>insns : vn>insn ( vn -- insn ) vns>insns get at ; -! biassocs mapping vregs to value numbers, and value numbers to -! 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 ; +: vreg>vn ( vreg -- vn ) vregs>vns get [ ] cache ; : 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 ( -- ) - 0 vn-counter set 0 input-expr-counter set - vregs>vns set + H{ } clone vregs>vns set H{ } clone exprs>vns set H{ } clone vns>insns set ; diff --git a/basis/compiler/cfg/value-numbering/value-numbering.factor b/basis/compiler/cfg/value-numbering/value-numbering.factor index a6a20b2229..01b095fbd7 100644 --- a/basis/compiler/cfg/value-numbering/value-numbering.factor +++ b/basis/compiler/cfg/value-numbering/value-numbering.factor @@ -21,11 +21,11 @@ IN: compiler.cfg.value-numbering GENERIC: process-instruction ( insn -- insn' ) : redundant-instruction ( insn vn -- insn' ) - [ dst>> ] dip [ swap set-vn ] [ vn>vreg ] 2bi ; + [ dst>> ] dip [ swap set-vn ] [ ] 2bi ; :: useful-instruction ( insn expr -- insn' ) - next-vn :> vn - vn insn dst>> vregs>vns get set-at + insn dst>> :> vn + vn vn vregs>vns get set-at vn expr exprs>vns get set-at insn vn vns>insns get set-at insn ;