compiler.cfg.value-numbering: factor out value renaming into a separate compiler.cfg.renaming vocabulary
parent
6810b922ee
commit
789d82745c
|
@ -0,0 +1,151 @@
|
|||
! Copyright (C) 2009 Slava Pestov.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: accessors assocs kernel namespaces sequences
|
||||
compiler.cfg.instructions compiler.cfg.registers ;
|
||||
IN: compiler.cfg.renaming
|
||||
|
||||
SYMBOL: renamings
|
||||
|
||||
: rename-value ( vreg -- vreg' ) renamings get at ;
|
||||
|
||||
GENERIC: rename-insn-defs ( insn -- )
|
||||
|
||||
M: ##flushable rename-insn-defs
|
||||
[ rename-value ] change-dst
|
||||
drop ;
|
||||
|
||||
M: insn rename-insn-defs drop ;
|
||||
|
||||
GENERIC: rename-insn-uses ( insn -- )
|
||||
|
||||
M: ##effect rename-insn-uses
|
||||
[ rename-value ] change-src
|
||||
drop ;
|
||||
|
||||
M: ##unary rename-insn-uses
|
||||
[ rename-value ] change-src
|
||||
drop ;
|
||||
|
||||
M: ##binary rename-insn-uses
|
||||
[ rename-value ] change-src1
|
||||
[ rename-value ] change-src2
|
||||
drop ;
|
||||
|
||||
M: ##binary-imm rename-insn-uses
|
||||
[ rename-value ] change-src1
|
||||
drop ;
|
||||
|
||||
M: ##slot rename-insn-uses
|
||||
[ rename-value ] change-obj
|
||||
[ rename-value ] change-slot
|
||||
drop ;
|
||||
|
||||
M: ##slot-imm rename-insn-uses
|
||||
[ rename-value ] change-obj
|
||||
drop ;
|
||||
|
||||
M: ##set-slot rename-insn-uses
|
||||
dup call-next-method
|
||||
[ rename-value ] change-obj
|
||||
[ rename-value ] change-slot
|
||||
drop ;
|
||||
|
||||
M: ##string-nth rename-insn-uses
|
||||
[ rename-value ] change-obj
|
||||
[ rename-value ] change-index
|
||||
drop ;
|
||||
|
||||
M: ##set-slot-imm rename-insn-uses
|
||||
dup call-next-method
|
||||
[ rename-value ] change-obj
|
||||
drop ;
|
||||
|
||||
M: ##alien-getter rename-insn-uses
|
||||
dup call-next-method
|
||||
[ rename-value ] change-src
|
||||
drop ;
|
||||
|
||||
M: ##alien-setter rename-insn-uses
|
||||
dup call-next-method
|
||||
[ rename-value ] change-value
|
||||
drop ;
|
||||
|
||||
M: ##conditional-branch rename-insn-uses
|
||||
[ rename-value ] change-src1
|
||||
[ rename-value ] change-src2
|
||||
drop ;
|
||||
|
||||
M: ##compare-imm-branch rename-insn-uses
|
||||
[ rename-value ] change-src1
|
||||
drop ;
|
||||
|
||||
M: ##dispatch rename-insn-uses
|
||||
[ rename-value ] change-src
|
||||
drop ;
|
||||
|
||||
M: ##fixnum-overflow rename-insn-uses
|
||||
[ rename-value ] change-src1
|
||||
[ rename-value ] change-src2
|
||||
drop ;
|
||||
|
||||
M: insn rename-insn-uses drop ;
|
||||
|
||||
: fresh-vreg ( vreg -- vreg' )
|
||||
reg-class>> next-vreg ;
|
||||
|
||||
GENERIC: fresh-insn-temps ( insn -- )
|
||||
|
||||
M: ##write-barrier fresh-insn-temps
|
||||
[ fresh-vreg ] change-card#
|
||||
[ fresh-vreg ] change-table
|
||||
drop ;
|
||||
|
||||
M: ##unary/temp fresh-insn-temps
|
||||
[ fresh-vreg ] change-temp drop ;
|
||||
|
||||
M: ##allot fresh-insn-temps
|
||||
[ fresh-vreg ] change-temp drop ;
|
||||
|
||||
M: ##dispatch fresh-insn-temps
|
||||
[ fresh-vreg ] change-temp drop ;
|
||||
|
||||
M: ##slot fresh-insn-temps
|
||||
[ fresh-vreg ] change-temp drop ;
|
||||
|
||||
M: ##set-slot fresh-insn-temps
|
||||
[ fresh-vreg ] change-temp drop ;
|
||||
|
||||
M: ##string-nth fresh-insn-temps
|
||||
[ fresh-vreg ] change-temp drop ;
|
||||
|
||||
M: ##set-string-nth-fast fresh-insn-temps
|
||||
[ fresh-vreg ] change-temp drop ;
|
||||
|
||||
M: ##compare fresh-insn-temps
|
||||
[ fresh-vreg ] change-temp drop ;
|
||||
|
||||
M: ##compare-imm fresh-insn-temps
|
||||
[ fresh-vreg ] change-temp drop ;
|
||||
|
||||
M: ##compare-float fresh-insn-temps
|
||||
[ fresh-vreg ] change-temp drop ;
|
||||
|
||||
M: ##fixnum-mul fresh-insn-temps
|
||||
[ fresh-vreg ] change-temp1
|
||||
[ fresh-vreg ] change-temp2
|
||||
drop ;
|
||||
|
||||
M: ##fixnum-mul-tail fresh-insn-temps
|
||||
[ fresh-vreg ] change-temp1
|
||||
[ fresh-vreg ] change-temp2
|
||||
drop ;
|
||||
|
||||
M: ##gc fresh-insn-temps
|
||||
[ fresh-vreg ] change-temp1
|
||||
[ fresh-vreg ] change-temp2
|
||||
drop ;
|
||||
|
||||
M: _dispatch fresh-insn-temps
|
||||
[ fresh-vreg ] change-temp drop ;
|
||||
|
||||
M: insn fresh-insn-temps drop ;
|
|
@ -1,69 +0,0 @@
|
|||
! Copyright (C) 2008 Slava Pestov.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: namespaces assocs sequences kernel accessors
|
||||
compiler.cfg.instructions compiler.cfg.value-numbering.graph ;
|
||||
IN: compiler.cfg.value-numbering.propagate
|
||||
|
||||
! If two vregs compute the same value, replace references to
|
||||
! the latter with the former.
|
||||
|
||||
: resolve ( vreg -- vreg' ) vreg>vn vn>vreg ; inline
|
||||
|
||||
GENERIC: propagate ( insn -- insn )
|
||||
|
||||
M: ##effect propagate
|
||||
[ resolve ] change-src ;
|
||||
|
||||
M: ##unary propagate
|
||||
[ resolve ] change-src ;
|
||||
|
||||
M: ##binary propagate
|
||||
[ resolve ] change-src1
|
||||
[ resolve ] change-src2 ;
|
||||
|
||||
M: ##binary-imm propagate
|
||||
[ resolve ] change-src1 ;
|
||||
|
||||
M: ##slot propagate
|
||||
[ resolve ] change-obj
|
||||
[ resolve ] change-slot ;
|
||||
|
||||
M: ##slot-imm propagate
|
||||
[ resolve ] change-obj ;
|
||||
|
||||
M: ##set-slot propagate
|
||||
call-next-method
|
||||
[ resolve ] change-obj
|
||||
[ resolve ] change-slot ;
|
||||
|
||||
M: ##string-nth propagate
|
||||
[ resolve ] change-obj
|
||||
[ resolve ] change-index ;
|
||||
|
||||
M: ##set-slot-imm propagate
|
||||
call-next-method
|
||||
[ resolve ] change-obj ;
|
||||
|
||||
M: ##alien-getter propagate
|
||||
call-next-method
|
||||
[ resolve ] change-src ;
|
||||
|
||||
M: ##alien-setter propagate
|
||||
call-next-method
|
||||
[ resolve ] change-value ;
|
||||
|
||||
M: ##conditional-branch propagate
|
||||
[ resolve ] change-src1
|
||||
[ resolve ] change-src2 ;
|
||||
|
||||
M: ##compare-imm-branch propagate
|
||||
[ resolve ] change-src1 ;
|
||||
|
||||
M: ##dispatch propagate
|
||||
[ resolve ] change-src ;
|
||||
|
||||
M: ##fixnum-overflow propagate
|
||||
[ resolve ] change-src1
|
||||
[ resolve ] change-src2 ;
|
||||
|
||||
M: insn propagate ;
|
|
@ -1 +0,0 @@
|
|||
Propagation pass to update code after value numbering
|
|
@ -1,12 +1,12 @@
|
|||
! Copyright (C) 2008 Slava Pestov.
|
||||
! Copyright (C) 2008, 2009 Slava Pestov.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
USING: namespaces assocs biassocs classes kernel math accessors
|
||||
sorting sets sequences
|
||||
sorting sets sequences fry
|
||||
compiler.cfg.local
|
||||
compiler.cfg.liveness
|
||||
compiler.cfg.renaming
|
||||
compiler.cfg.value-numbering.graph
|
||||
compiler.cfg.value-numbering.expressions
|
||||
compiler.cfg.value-numbering.propagate
|
||||
compiler.cfg.value-numbering.simplify
|
||||
compiler.cfg.value-numbering.rewrite ;
|
||||
IN: compiler.cfg.value-numbering
|
||||
|
@ -19,8 +19,18 @@ IN: compiler.cfg.value-numbering
|
|||
init-expressions
|
||||
number-input-values ;
|
||||
|
||||
: vreg>vreg-mapping ( -- assoc )
|
||||
vregs>vns get [ keys ] keep
|
||||
'[ dup _ [ at ] [ value-at ] bi ] H{ } map>assoc ;
|
||||
|
||||
: rename-uses ( insns -- )
|
||||
vreg>vreg-mapping renamings [
|
||||
[ rename-insn-uses ] each
|
||||
] with-variable ;
|
||||
|
||||
: value-numbering-step ( insns -- insns' )
|
||||
[ [ number-values ] [ rewrite propagate ] bi ] map ;
|
||||
[ [ number-values ] [ rewrite ] bi ] map
|
||||
dup rename-uses ;
|
||||
|
||||
: value-numbering ( cfg -- cfg' )
|
||||
[ init-value-numbering ] [ value-numbering-step ] local-optimization ;
|
||||
|
|
Loading…
Reference in New Issue