]> gitweb.factorcode.org Git - factor.git/commitdiff
compiler.cfg.copy-prop: Global copy propagation
authorSlava Pestov <slava@shill.local>
Fri, 24 Jul 2009 10:30:46 +0000 (05:30 -0500)
committerSlava Pestov <slava@shill.local>
Fri, 24 Jul 2009 10:30:46 +0000 (05:30 -0500)
basis/compiler/cfg/copy-prop/copy-prop.factor
basis/compiler/cfg/optimizer/optimizer.factor
basis/compiler/cfg/renaming/renaming.factor

index d526ea9c1da6473595d286747ba99a9c58c57d3b..b13aa5d75b0fe98448dd60a36df571f7b17eca81 100644 (file)
@@ -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 ;
index e4ad290097a4dbabc063140c332c7e7f66fc4920..ede2a9382cae61508840090b7e8c1b7c38886870 100644 (file)
@@ -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
index a2204fb36ec4f2f45c81843e0015c1fd35d010f5..eb8538256a36f51e9162d2bbc2e4a9eb995a479a 100644 (file)
@@ -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' )