compiler.cfg.gvn: some poorly thought-out attempts at redundancy elimination that don't work; committed for posterity

db4
Alex Vondrak 2011-06-27 15:19:57 -07:00 committed by John Benediktsson
parent 3d66cc52fb
commit 09c6a2c040
4 changed files with 25 additions and 15 deletions

View File

@ -88,4 +88,4 @@ M: ##load-reference >expr obj>> <reference-expr> ;
! phi equivalences ! phi equivalences
M: ##phi >expr M: ##phi >expr
inputs>> values [ vreg>canon-vn ] map \ ##phi prefix ; inputs>> values [ vreg>leader ] map \ ##phi prefix ;

View File

@ -25,14 +25,10 @@ SYMBOL: final-iteration?
: vn>insn ( vn -- insn ) vns>insns get at ; : vn>insn ( vn -- insn ) vns>insns get at ;
: vreg>canon-vn ( vreg -- vn ) : vreg>leader ( vreg -- vn ) vregs>vns get at ;
vregs>vns get at ;
: vreg>avail-vn ( vreg -- vn )
dup vreg>canon-vn dup available? [ nip ] [ drop ] if ;
: vreg>vn ( vreg -- vn ) : vreg>vn ( vreg -- vn )
final-iteration? get [ vreg>avail-vn ] [ vreg>canon-vn ] if ; dup vreg>leader dup available? [ nip ] [ drop ] if ;
: set-vn ( vn vreg -- ) : set-vn ( vn vreg -- )
vregs>vns get maybe-set-at [ changed? on ] when ; vregs>vns get maybe-set-at [ changed? on ] when ;
@ -41,12 +37,10 @@ SYMBOL: final-iteration?
: clear-exprs ( -- ) : clear-exprs ( -- )
exprs>vns get clear-assoc exprs>vns get clear-assoc
vns>insns get clear-assoc vns>insns get clear-assoc ;
bbs>defns get clear-assoc ;
: init-value-graph ( -- ) : init-value-graph ( -- )
0 input-expr-counter set 0 input-expr-counter set
H{ } clone 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 ;
H{ } clone bbs>defns set ;

View File

@ -18,8 +18,7 @@ compiler.cfg.gvn.math
compiler.cfg.gvn.rewrite compiler.cfg.gvn.rewrite
compiler.cfg.gvn.slots compiler.cfg.gvn.slots
compiler.cfg.gvn.misc compiler.cfg.gvn.misc
compiler.cfg.gvn.expressions compiler.cfg.gvn.expressions ;
compiler.cfg.gvn.redundancy-elimination ;
IN: compiler.cfg.gvn IN: compiler.cfg.gvn
GENERIC: process-instruction ( insn -- insn' ) GENERIC: process-instruction ( insn -- insn' )
@ -32,7 +31,6 @@ GENERIC: process-instruction ( insn -- insn' )
vn vn set-vn vn vn set-vn
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
vn vn basic-block get bbs>defns get [ ?set-at ] change-at
insn ; insn ;
: check-redundancy ( insn -- insn' ) : check-redundancy ( insn -- insn' )
@ -44,6 +42,11 @@ M: insn process-instruction
[ process-instruction ] [ process-instruction ]
[ dup defs-vregs length 1 = [ check-redundancy ] when ] ?if ; [ dup defs-vregs length 1 = [ check-redundancy ] when ] ?if ;
UNION: don't-check-redundancy alien-call-insn ##callback-inputs ;
M: don't-check-redundancy process-instruction
dup rewrite [ process-instruction ] [ ] ?if ;
M: ##copy process-instruction M: ##copy process-instruction
dup [ src>> vreg>vn ] [ dst>> ] bi set-vn ; dup [ src>> vreg>vn ] [ dst>> ] bi set-vn ;
@ -59,6 +62,7 @@ M: array process-instruction
: identify-redundancies ( cfg -- ) : identify-redundancies ( cfg -- )
final-iteration? off final-iteration? off
! dup compute-avail-sets
init-value-graph init-value-graph
'[ '[
changed? off changed? off
@ -66,9 +70,21 @@ M: array process-instruction
changed? get changed? get
] loop ; ] loop ;
: eliminate-redundancies ( cfg -- )
final-iteration? on
! dup compute-avail-sets
clear-exprs
[ value-numbering-step ] simple-optimization ;
USE: prettyprint
: value-numbering ( cfg -- cfg ) : value-numbering ( cfg -- cfg )
needs-predecessors needs-predecessors
dup compute-avail-sets
! avail-ins get [ [ number>> ] [ keys ] bi* ] assoc-map .
dup identify-redundancies dup identify-redundancies
dup eliminate-redundancies dup eliminate-redundancies

View File

@ -16,7 +16,7 @@ M: ##replace rewrite
] [ 2drop f ] if ; ] [ 2drop f ] if ;
M: ##phi rewrite M: ##phi rewrite
[ dst>> ] [ inputs>> values [ vreg>canon-vn ] map sift ] bi [ dst>> ] [ inputs>> values [ vreg>leader ] map sift ] bi
dup all-equal? [ dup all-equal? [
[ drop f ] [ drop f ]
[ first <copy> ] if-empty [ first <copy> ] if-empty