]> gitweb.factorcode.org Git - factor.git/commitdiff
compiler.cfg.branch-splitting: re-enable with a better heuristic
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Tue, 28 Jul 2009 13:48:05 +0000 (08:48 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Tue, 28 Jul 2009 13:48:05 +0000 (08:48 -0500)
basis/compiler/cfg/branch-splitting/branch-splitting.factor
basis/compiler/cfg/optimizer/optimizer.factor

index 89e3604aec44b1a66546aa59a1a3299459772506..8618932e14d973c45b30399c9de48cfb86a39d79 100644 (file)
@@ -54,13 +54,31 @@ UNION: irrelevant ##peek ##replace ##inc-d ##inc-r ;
 
 : split-instructions? ( insns -- ? ) [ irrelevant? not ] count 5 <= ;
 
-: split-branch? ( bb -- ? )
+: short-tail-block? ( bb -- ? )
+    [ successors>> empty? ] [ instructions>> length 2 = ] bi and ;
+
+: short-block? ( bb -- ? )
+    ! If block is empty, always split
+    [ predecessors>> length ] [ instructions>> length 1 - ] bi * 10 <= ;
+
+: cond-cond-block? ( bb -- ? )
     {
-        [ dup successors>> [ back-edge? ] with any? not ]
-        [ predecessors>> length 2 4 between? ]
-        [ instructions>> split-instructions? ]
+        [ predecessors>> length 2 = ]
+        [ successors>> length 2 = ]
+        [ instructions>> length 20 <= ]
     } 1&& ;
 
+: split-branch? ( bb -- ? )
+    dup loop-entry? [ drop f ] [
+        dup predecessors>> length 1 <= [ drop f ] [
+            {
+                [ short-block? ]
+                [ short-tail-block? ]
+                [ cond-cond-block? ]
+            } 1||
+        ] if
+    ] if ;
+
 : split-branches ( cfg -- cfg' )
     dup [
         dup split-branch? [ split-branch ] [ drop ] if
index cbccf42c343525489bdf2b1c559aa469f0dfec60..b411c42a35ef73da78b7ee06f364df44f775eb91 100644 (file)
@@ -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