compiler.cfg.gvn: add simple gcse (avoid rewriting & ##phi handling)

db4
Alex Vondrak 2011-07-02 13:41:25 -07:00 committed by John Benediktsson
parent a9aebc2854
commit 774264b9f9
1 changed files with 45 additions and 5 deletions

View File

@ -27,6 +27,8 @@ M: insn simplify dup rewrite [ simplify ] [ ] ?if ;
M: array simplify [ simplify ] map ;
M: ##copy simplify ;
! ! ! Global value numbering
GENERIC: value-number ( insn -- )
M: array value-number [ value-number ] each ;
@ -49,11 +51,11 @@ M: ##copy value-number [ src>> vreg>vn ] [ dst>> ] bi set-vn ;
dup >expr dup exprs>vns get at
[ redundant-instruction ] [ useful-instruction ] ?if ;
M: ##phi value-number
dup inputs>> values [ vreg>vn ] map sift
dup all-equal? [
[ drop ] [ first redundant-instruction ] if-empty
] [ drop check-redundancy ] if ;
! M: ##phi value-number
! dup inputs>> values [ vreg>vn ] map sift
! dup all-equal? [
! [ drop ] [ first redundant-instruction ] if-empty
! ] [ drop check-redundancy ] if ;
M: insn value-number
dup defs-vregs length 1 = [ check-redundancy ] [ drop ] if ;
@ -73,8 +75,46 @@ M: insn value-number
changed? get
] loop ;
! ! ! Global common subexpression elimination
GENERIC: gcse ( insn -- insn' )
M: array gcse [ gcse ] map ;
M: alien-call-insn gcse ;
M: ##callback-inputs gcse ;
M: ##copy gcse ;
: ?eliminate ( insn vn -- insn' )
dup available? [
[ dst>> ] dip <copy>
] [ drop make-available ] if ;
: eliminate-redundancy ( insn -- insn' )
dup >expr exprs>vns get at
[ ?eliminate ] [ make-available ] if* ;
! M: ##phi gcse
! dup inputs>> values [ vreg>vn ] map sift
! dup all-equal? [
! [ first ?eliminate ] unless-empty
! ] [ drop eliminate-redundancy ] if ;
M: insn gcse
dup defs-vregs length 1 = [ eliminate-redundancy ] when ;
: gcse-step ( insns -- insns' )
! [ simplify gcse ] map flatten ;
[ gcse ] map flatten ;
: eliminate-common-subexpressions ( cfg -- )
final-iteration? on
dup compute-avail-sets
[ gcse-step ] simple-optimization ;
: value-numbering ( cfg -- cfg )
needs-predecessors
dup determine-value-numbers
dup eliminate-common-subexpressions
cfg-changed predecessors-changed ;