diff --git a/basis/compiler/cfg/renaming/renaming.factor b/basis/compiler/cfg/renaming/renaming.factor new file mode 100644 index 0000000000..4a8c6e6a4d --- /dev/null +++ b/basis/compiler/cfg/renaming/renaming.factor @@ -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 ; \ No newline at end of file diff --git a/basis/compiler/cfg/value-numbering/propagate/propagate.factor b/basis/compiler/cfg/value-numbering/propagate/propagate.factor deleted file mode 100644 index d5c9830c0b..0000000000 --- a/basis/compiler/cfg/value-numbering/propagate/propagate.factor +++ /dev/null @@ -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 ; diff --git a/basis/compiler/cfg/value-numbering/propagate/summary.txt b/basis/compiler/cfg/value-numbering/propagate/summary.txt deleted file mode 100644 index fd56a8e099..0000000000 --- a/basis/compiler/cfg/value-numbering/propagate/summary.txt +++ /dev/null @@ -1 +0,0 @@ -Propagation pass to update code after value numbering diff --git a/basis/compiler/cfg/value-numbering/value-numbering.factor b/basis/compiler/cfg/value-numbering/value-numbering.factor index 9f5473c62f..f0efa5dcca 100644 --- a/basis/compiler/cfg/value-numbering/value-numbering.factor +++ b/basis/compiler/cfg/value-numbering/value-numbering.factor @@ -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 ;