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' )