From 7068de6cd30322fd77d4e39454c30c69b2421cef Mon Sep 17 00:00:00 2001 From: Slava Pestov <slava@shill.local> Date: Fri, 24 Jul 2009 05:30:46 -0500 Subject: [PATCH] compiler.cfg.copy-prop: Global copy propagation --- basis/compiler/cfg/copy-prop/copy-prop.factor | 28 +++++++++++++++++-- basis/compiler/cfg/optimizer/optimizer.factor | 8 ++++-- basis/compiler/cfg/renaming/renaming.factor | 4 +++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/basis/compiler/cfg/copy-prop/copy-prop.factor b/basis/compiler/cfg/copy-prop/copy-prop.factor index d526ea9c1d..b13aa5d75b 100644 --- a/basis/compiler/cfg/copy-prop/copy-prop.factor +++ b/basis/compiler/cfg/copy-prop/copy-prop.factor @@ -1,8 +1,10 @@ -! Copyright (C) 2008 Slava Pestov. +! Copyright (C) 2008, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: kernel namespaces assocs accessors ; +USING: kernel namespaces assocs accessors sequences +compiler.cfg.rpo compiler.cfg.renaming compiler.cfg.instructions ; IN: compiler.cfg.copy-prop +! The first three definitions are also used in compiler.cfg.alias-analysis. SYMBOL: copies : resolve ( vreg -- vreg ) @@ -10,3 +12,25 @@ SYMBOL: copies : record-copy ( insn -- ) [ src>> resolve ] [ dst>> ] bi copies get set-at ; inline + +: collect-copies ( cfg -- ) + H{ } clone copies set + [ + instructions>> + [ dup ##copy? [ record-copy ] [ drop ] if ] each + ] each-basic-block ; + +: rename-copies ( cfg -- ) + copies get dup assoc-empty? [ 2drop ] [ + renamings set + [ + instructions>> + [ dup ##copy? [ drop f ] [ rename-insn-uses t ] if ] filter-here + ] each-basic-block + ] if ; + +: copy-propagation ( cfg -- cfg' ) + [ collect-copies ] + [ rename-copies ] + [ ] + tri ; diff --git a/basis/compiler/cfg/optimizer/optimizer.factor b/basis/compiler/cfg/optimizer/optimizer.factor index e4ad290097..ede2a9382c 100644 --- a/basis/compiler/cfg/optimizer/optimizer.factor +++ b/basis/compiler/cfg/optimizer/optimizer.factor @@ -2,18 +2,19 @@ ! See http://factorcode.org/license.txt for BSD license. USING: kernel sequences accessors combinators namespaces compiler.cfg.tco -compiler.cfg.predecessors compiler.cfg.useless-conditionals -compiler.cfg.ssa compiler.cfg.branch-splitting compiler.cfg.block-joining +compiler.cfg.ssa compiler.cfg.alias-analysis compiler.cfg.value-numbering +compiler.cfg.copy-prop compiler.cfg.dce compiler.cfg.write-barrier -compiler.cfg.rpo compiler.cfg.phi-elimination compiler.cfg.empty-blocks +compiler.cfg.predecessors +compiler.cfg.rpo compiler.cfg.checker ; IN: compiler.cfg.optimizer @@ -38,6 +39,7 @@ SYMBOL: check-optimizer? alias-analysis value-numbering compute-predecessors + copy-propagation eliminate-dead-code eliminate-write-barriers eliminate-phis diff --git a/basis/compiler/cfg/renaming/renaming.factor b/basis/compiler/cfg/renaming/renaming.factor index a2204fb36e..eb8538256a 100644 --- a/basis/compiler/cfg/renaming/renaming.factor +++ b/basis/compiler/cfg/renaming/renaming.factor @@ -102,6 +102,10 @@ M: ##fixnum-overflow rename-insn-uses [ rename-value ] change-src2 drop ; +M: ##phi rename-insn-uses + [ [ rename-value ] assoc-map ] change-inputs + drop ; + M: insn rename-insn-uses drop ; : fresh-vreg ( vreg -- vreg' )