]> gitweb.factorcode.org Git - factor.git/commitdiff
compiler.cfg.coalescing: more or less complete, now needs debugging
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Mon, 27 Jul 2009 07:20:45 +0000 (02:20 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Mon, 27 Jul 2009 07:20:45 +0000 (02:20 -0500)
basis/compiler/cfg/coalescing/coalescing.factor
basis/compiler/cfg/coalescing/copies/copies.factor
basis/compiler/cfg/coalescing/renaming/renaming.factor
basis/compiler/cfg/dominance/dominance.factor
basis/compiler/cfg/optimizer/optimizer.factor
basis/compiler/cfg/ssa/ssa.factor
basis/disjoint-sets/disjoint-sets.factor

index 05a67a230b98e498c256a85570931c6fe622eadc..fe6166302f16dbd363ce6117ca797a1a680a4d7e 100644 (file)
@@ -1,8 +1,9 @@
 ! Copyright (C) 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors assocs fry kernel locals math math.order
-sequences
+sequences namespaces sets
 compiler.cfg.rpo
+compiler.cfg.def-use
 compiler.cfg.utilities
 compiler.cfg.dominance
 compiler.cfg.instructions
@@ -21,7 +22,24 @@ IN: compiler.cfg.coalescing
 : process-blocks ( cfg -- )
     [ [ process-block ] if-has-phis ] each-basic-block ;
 
-: break-interferences ( -- ) ;
+SYMBOL: seen
+
+:: visit-renaming ( dst assoc src bb -- )
+    src seen get key? [
+        src dst bb waiting-for push-at
+        src assoc delete-at
+    ] [ src seen get conjoin ] if ;
+
+:: break-interferences ( -- )
+    V{ } clone seen set
+    renaming-sets get [| dst assoc |
+        assoc [| src bb |
+            src seen get key?
+            [ dst assoc src bb visit-renaming ]
+            [ src seen get conjoin ]
+            if
+        ] assoc-each
+    ] assoc-each ;
 
 : remove-phis-from-block ( bb -- )
     instructions>> [ ##phi? not ] filter-here ;
@@ -31,9 +49,11 @@ IN: compiler.cfg.coalescing
 
 : coalesce ( cfg -- cfg' )
     init-coalescing
+    dup compute-def-use
+    dup compute-dominance
     dup compute-dfs
     dup process-blocks
     break-interferences
     dup insert-copies
-    perform-renaming
+    dup perform-renaming
     dup remove-phis ;
\ No newline at end of file
index 7293bcc8025bb63c0596dacb294de5ab5fb03073..86f9e1242385acabbec6c95dc191823fab85a6a6 100644 (file)
@@ -1,39 +1,21 @@
 ! Copyright (C) 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors assocs combinators fry kernel namespaces sequences
-compiler.cfg.def-use compiler.cfg.dominance compiler.cfg.instructions
-compiler.cfg.renaming ;
+USING: accessors assocs hashtables fry kernel make namespaces
+sequences compiler.cfg.coalescing.state compiler.cfg.parallel-copy ;
 IN: compiler.cfg.coalescing.copies
 
-SYMBOLS: stacks visited pushed ;
-
-: compute-renaming ( insn -- assoc )
-    uses-vregs stacks get
-    '[ dup dup _ at [ nip last ] unless-empty ]
-    H{ } map>assoc ;
-
-: rename-operands ( bb -- )
-    instructions>> [
-        dup ##phi? [ drop ] [
-            dup compute-renaming renamings set
-            [ rename-insn-uses ] [ rename-insn-defs ] bi
-        ] if
-    ] each ;
-
-: schedule-copies ( bb -- )
-    ! FIXME
-    drop ;
-
-: pop-stacks ( -- )
-    pushed get stacks get '[ drop _ at pop* ] assoc-each ;
-
-: (insert-copies) ( bb -- )
-    H{ } clone pushed [
-        [ rename-operands ]
-        [ schedule-copies ]
-        [ dom-children [ (insert-copies) ] each ] tri
-        pop-stacks
-    ] with-variable ;
+: compute-copies ( assoc -- assoc' )
+    dup assoc-size <hashtable> [
+        '[
+            [ _ set-at ] with each
+        ] assoc-each
+    ] keep ;
 
 : insert-copies ( cfg -- )
-    entry>> (insert-copies) ;
\ No newline at end of file
+    waiting get [
+        [ instructions>> building ] dip '[
+            building get pop
+            _ compute-copies parallel-copy
+            ,
+        ] with-variable
+    ] assoc-each ;
\ No newline at end of file
index 3b26c09738d5251fff2355592c5f306c1458f1e0..bad74807d0e57e3546ff3f8cca6b13fbf5ba2553 100644 (file)
@@ -1,10 +1,33 @@
 ! Copyright (C) 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel ;
+USING: accessors assocs fry kernel namespaces sequences
+compiler.cfg.coalescing.state compiler.cfg.renaming compiler.cfg.rpo
+disjoint-sets ;
 IN: compiler.cfg.coalescing.renaming
 
-: perform-renaming ( -- )
-    renaming-sets get [
-        ! XXX
-        2drop
-    ] assoc-each ;
+: update-congruence-class ( dst assoc disjoint-set -- )
+    [ keys swap ] dip
+    [ nip add-atoms ]
+    [ add-atom drop ]
+    [ equate-all-with ] 3tri ;
+        
+: build-congruence-classes ( -- disjoint-set )
+    renaming-sets get
+    <disjoint-set> [
+        '[
+            _ update-congruence-class
+        ] assoc-each
+    ] keep ;
+
+: compute-renaming ( disjoint-set -- assoc )
+    [ parents>> ] keep
+    '[ drop dup _ representative ] assoc-map ;
+
+: perform-renaming ( cfg -- )
+    build-congruence-classes compute-renaming renamings set
+    [
+        instructions>> [
+            [ rename-insn-defs ]
+            [ rename-insn-uses ] bi
+        ] each
+    ] each-basic-block ;
index 6eeeacd6f1703adebdb6f613dc67f4cc3deda1a6..ebd3a981d7c544c2abf9df25933b4c05f61e3a7b 100644 (file)
@@ -60,21 +60,26 @@ PRIVATE>
     [ '[ 2dup eq? [ 2drop ] [ _ push-at ] if ] assoc-each ] keep
     dom-childrens set ;
 
-! Maps bb -> DF(bb)
-SYMBOL: dom-frontiers
-
 PRIVATE>
 
-: dom-frontier ( bb -- set ) dom-frontiers get at keys ;
+: compute-dominance ( cfg -- )
+    compute-dom-parents compute-dom-children ;
 
 <PRIVATE
 
+! Maps bb -> DF(bb)
+SYMBOL: dom-frontiers
+
 : compute-dom-frontier ( bb pred -- )
     2dup [ dom-parent ] dip eq? [ 2drop ] [
         [ dom-frontiers get conjoin-at ]
         [ dom-parent compute-dom-frontier ] 2bi
     ] if ;
 
+PRIVATE>
+
+: dom-frontier ( bb -- set ) dom-frontiers get at keys ;
+
 : compute-dom-frontiers ( cfg -- )
     H{ } clone dom-frontiers set
     [
@@ -83,13 +88,6 @@ PRIVATE>
         ] [ 2drop ] if
     ] each-basic-block ;
 
-PRIVATE>
-
-: compute-dominance ( cfg -- )
-    [ compute-dom-parents compute-dom-children ]
-    [ compute-dom-frontiers ]
-    bi ;
-
 <PRIVATE
 
 SYMBOLS: work-list visited ;
index ede2a9382cae61508840090b7e8c1b7c38886870..cbccf42c343525489bdf2b1c559aa469f0dfec60 100644 (file)
@@ -11,7 +11,7 @@ compiler.cfg.value-numbering
 compiler.cfg.copy-prop
 compiler.cfg.dce
 compiler.cfg.write-barrier
-compiler.cfg.phi-elimination
+compiler.cfg.coalescing
 compiler.cfg.empty-blocks
 compiler.cfg.predecessors
 compiler.cfg.rpo
@@ -32,7 +32,7 @@ SYMBOL: check-optimizer?
         optimize-tail-calls
         delete-useless-conditionals
         compute-predecessors
-        split-branches
+        split-branches
         join-blocks
         compute-predecessors
         construct-ssa
@@ -42,7 +42,7 @@ SYMBOL: check-optimizer?
         copy-propagation
         eliminate-dead-code
         eliminate-write-barriers
-        eliminate-phis
+        coalesce
         delete-empty-blocks
         ?check
     ] with-scope ;
index 97b8db81045600859a5a4458bad23ee0948ea08d..410d8fd95139923c380db7eaef38df88e745d732 100644 (file)
@@ -113,6 +113,7 @@ PRIVATE>
         [ ]
         [ compute-live-sets ]
         [ compute-dominance ]
+        [ compute-dom-frontiers ]
         [ compute-defs compute-phi-nodes insert-phi-nodes ]
         [ rename ]
     } cleave ;
\ No newline at end of file
index a3e5c7ceb7bce396bcf55635302a92fcf42a57ff..80ab2f58bf4a0ae467bc18db6d8e940d500acd0e 100644 (file)
@@ -35,6 +35,8 @@ TUPLE: disjoint-set
 : representative? ( a disjoint-set -- ? )
     dupd parent = ; inline
 
+PRIVATE>
+
 GENERIC: representative ( a disjoint-set -- p )
 
 M: disjoint-set representative
@@ -42,6 +44,8 @@ M: disjoint-set representative
         [ [ parent ] keep representative dup ] 2keep set-parent
     ] if ;
 
+<PRIVATE
+
 : representatives ( a b disjoint-set -- r r )
     [ representative ] curry bi@ ; inline