]> gitweb.factorcode.org Git - factor.git/commitdiff
compiler.cfg.def-use: build def-use chains
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Mon, 27 Jul 2009 02:10:14 +0000 (21:10 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Mon, 27 Jul 2009 02:10:14 +0000 (21:10 -0500)
basis/compiler/cfg/def-use/def-use.factor
basis/compiler/cfg/ssa/ssa.factor

index 0f488de559888d157b38fe72b22358370dc98b3d..d4d6ce8289638921a24961f0857ca3ce13109c46 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays kernel assocs sequences
-sets compiler.cfg.instructions ;
+USING: accessors arrays kernel assocs sequences namespaces fry
+sets compiler.cfg.rpo compiler.cfg.instructions ;
 IN: compiler.cfg.def-use
 
 GENERIC: defs-vregs ( insn -- seq )
@@ -49,3 +49,56 @@ M: _conditional-branch uses-vregs [ src1>> ] [ src2>> ] bi 2array ;
 M: _compare-imm-branch uses-vregs src1>> 1array ;
 M: _dispatch uses-vregs src>> 1array ;
 M: insn uses-vregs drop f ;
+
+! Computing def-use chains. We don't assume a program is in SSA form,
+! since SSA construction itself needs def-use information. defs-1
+! is only useful if the program is SSA.
+SYMBOLS: defs defs-1 insns uses ;
+
+: def-of ( vreg -- node ) defs-1 get at ;
+: defs-of ( vreg -- nodes ) defs get at ;
+: uses-of ( vreg -- nodes ) uses get at ;
+: insn-of ( vreg -- insn ) insns get at ;
+
+<PRIVATE
+
+: finish-defs ( -- )
+    defs [ [ keys ] assoc-map ] change ;
+
+: finish-uses ( -- )
+    uses [ [ keys ] assoc-map ] change ;
+
+: (compute-def-use) ( cfg quot -- assoc )
+    H{ } clone [
+        '[
+            dup instructions>> [
+                @ [
+                    _ conjoin-at
+                ] with each
+            ] with each
+        ] each-basic-block
+    ] keep
+    [ keys ] assoc-map ; inline
+
+PRIVATE>
+
+: compute-defs ( cfg -- )
+    [ defs-vregs ] (compute-def-use)
+    [ defs set ] [ [ first ] assoc-map defs-1 set ] bi ;
+
+: compute-uses ( cfg -- )
+    [ uses-vregs ] (compute-def-use) uses set ;
+
+: compute-insns ( cfg -- )
+    H{ } clone [
+        '[
+            instructions>> [
+                dup defs-vregs [
+                    _ set-at
+                ] with each
+            ] each
+        ] each-basic-block
+    ] keep insns set ;
+
+: compute-def-use ( cfg -- )
+    [ compute-defs ] [ compute-uses ] [ compute-insns ] tri ;
\ No newline at end of file
index 2e76ba35a1cc9f88ad86328a1407397f4a28dfed..97b8db81045600859a5a4458bad23ee0948ea08d 100644 (file)
@@ -23,22 +23,9 @@ IN: compiler.cfg.ssa
 
 <PRIVATE
 
-! Maps vreg to sequence of basic blocks
-SYMBOL: defs
-
 ! Maps basic blocks to sequences of vregs
 SYMBOL: inserting-phi-nodes
 
-: compute-defs ( cfg -- )
-    H{ } clone dup defs set
-    '[
-        dup instructions>> [
-            defs-vregs [
-                _ conjoin-at
-            ] with each
-        ] with each
-    ] each-basic-block ;
-
 : insert-phi-node-later ( vreg bb -- )
     2dup live-in key? [
         [ predecessors>> over '[ _ ] H{ } map>assoc \ ##phi new-insn ] keep
@@ -46,7 +33,7 @@ SYMBOL: inserting-phi-nodes
     ] [ 2drop ] if ;
 
 : compute-phi-nodes-for ( vreg bbs -- )
-    keys dup length 2 >= [
+    dup length 2 >= [
         iterated-dom-frontier [
             insert-phi-node-later
         ] with each