diff --git a/basis/compiler/cfg/copy-prop/copy-prop.factor b/basis/compiler/cfg/copy-prop/copy-prop.factor index 63f299d2a3..1f2c75f28a 100644 --- a/basis/compiler/cfg/copy-prop/copy-prop.factor +++ b/basis/compiler/cfg/copy-prop/copy-prop.factor @@ -1,6 +1,6 @@ ! Copyright (C) 2008, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: kernel namespaces assocs accessors sequences +USING: kernel namespaces assocs accessors sequences grouping compiler.cfg.rpo compiler.cfg.renaming compiler.cfg.instructions ; IN: compiler.cfg.copy-prop @@ -8,10 +8,13 @@ IN: compiler.cfg.copy-prop SYMBOL: copies : resolve ( vreg -- vreg ) - [ copies get at ] keep or ; + copies get ?at drop ; + +: (record-copy) ( dst src -- ) + swap copies get set-at ; inline : record-copy ( ##copy -- ) - [ src>> resolve ] [ dst>> ] bi copies get set-at ; inline + [ dst>> ] [ src>> resolve ] bi (record-copy) ; inline > values [ resolve ] map all-equal? [ "BLAH!" print ] when ; +M: ##phi visit-insn + [ dst>> ] [ inputs>> values [ resolve ] map ] bi + dup all-equal? [ first (record-copy) ] [ 2drop ] if ; M: insn visit-insn drop ; @@ -34,6 +39,9 @@ GENERIC: update-insn ( insn -- keep? ) M: ##copy update-insn drop f ; +M: ##phi update-insn + dup dst>> copies get key? [ drop f ] [ call-next-method ] if ; + M: insn update-insn rename-insn-uses t ; : rename-copies ( cfg -- )