]> gitweb.factorcode.org Git - factor.git/commitdiff
compiler.cfg.linear-scan.linear-scan: refactoring of word so that locals doesn't...
authorBjörn Lindqvist <bjourne@gmail.com>
Sun, 12 Apr 2015 04:00:06 +0000 (06:00 +0200)
committerJohn Benediktsson <mrjbq7@gmail.com>
Wed, 29 Apr 2015 16:31:56 +0000 (09:31 -0700)
basis/compiler/cfg/linear-scan/assignment/assignment-tests.factor
basis/compiler/cfg/linear-scan/assignment/assignment.factor
basis/compiler/cfg/linear-scan/linear-scan-docs.factor
basis/compiler/cfg/linear-scan/linear-scan.factor

index 7f71bb45cd48a080fe01283b79d073843a548314..5c92db23b7bf69b943dae5180811e0f95f87d2cb 100644 (file)
@@ -37,3 +37,8 @@ IN: compiler.cfg.linear-scan.assignment.tests
     pending-interval-heap set 90 expire-old-intervals
     pending-interval-heap get heap-size
 ] unit-test
+
+{ } [
+    V{ T{ ##inc { loc D 3 } { insn# 7 } } } 0 insns>block block>cfg { }
+    assign-registers
+] unit-test
index f0f9739bbc6bac5e685f1b53a1ef0d551c093757..03e6b19768f7d9dd654dbe1bab5fa73bab1a156f 100644 (file)
@@ -136,9 +136,9 @@ M: insn assign-registers-in-insn drop ;
     } cleave ;
 
 :: assign-registers-in-block ( bb -- )
+    bb begin-block
     bb [
         [
-            bb begin-block
             [
                 {
                     [ insn#>> 1 - prepare-insn ]
@@ -147,11 +147,11 @@ M: insn assign-registers-in-insn drop ;
                     [ , ]
                 } cleave
             ] each
-            bb compute-live-out
         ] V{ } make
-    ] change-instructions drop ;
+    ] change-instructions drop
+    bb compute-live-out ;
 
-: assign-registers ( live-intervals cfg -- )
-    [ init-assignment ] dip
+: assign-registers ( cfg live-intervals -- )
+    init-assignment
     linearization-order [ kill-block?>> not ] filter
     [ assign-registers-in-block ] each ;
index 5cb837a72ab087b91303423c6cfb532ee1cb4254..15ef0e76356342567a89e03dc6056bb9538dc3c4 100644 (file)
@@ -4,3 +4,16 @@ IN: compiler.cfg.linear-scan
 HELP: admissible-registers
 { $values { "cfg" cfg } { "regs" assoc } }
 { $description "Lists all registers usable by the cfg by register class. In general, that's all registers except the frame pointer register that might be used by the cfg for other purposes." } ;
+
+ARTICLE: "compiler.cfg.linear-scan" "Linear-scan register allocation"
+"Linear scan to assign physical registers. SSA liveness must have been computed already."
+$nl
+"References:"
+{ $list
+  "Linear Scan Register Allocation by Massimiliano Poletto and Vivek Sarkar http://www.cs.ucla.edu/~palsberg/course/cs132/linearscan.pdf"
+  "Linear Scan Register Allocation for the Java HotSpot Client Compiler by Christian Wimmer and http://www.ssw.uni-linz.ac.at/Research/Papers/Wimmer04Master/"
+  "Quality and Speed in Linear-scan Register Allocation by Omri Traub, Glenn Holloway, Michael D. Smith http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.34.8435"
+} ;
+
+
+ABOUT: "compiler.cfg.linear-scan"
index e30f12fd0a943c7083479634d33ee0b3a96ffe0e..d444427a67949152f33b1b6b911380d87a406879 100644 (file)
@@ -4,37 +4,23 @@ USING: accessors assocs compiler.cfg.linear-scan.allocation
 compiler.cfg.linear-scan.assignment
 compiler.cfg.linear-scan.live-intervals
 compiler.cfg.linear-scan.numbering
-compiler.cfg.linear-scan.resolve cpu.architecture kernel locals
-sequences ;
+compiler.cfg.linear-scan.resolve compiler.cfg.utilities cpu.architecture
+kernel sequences ;
 IN: compiler.cfg.linear-scan
 
-! References:
-
-! Linear Scan Register Allocation
-! by Massimiliano Poletto and Vivek Sarkar
-! http://www.cs.ucla.edu/~palsberg/course/cs132/linearscan.pdf
-
-! Linear Scan Register Allocation for the Java HotSpot Client Compiler
-! by Christian Wimmer
-! and http://www.ssw.uni-linz.ac.at/Research/Papers/Wimmer04Master/
-
-! Quality and Speed in Linear-scan Register Allocation
-! by Omri Traub, Glenn Holloway, Michael D. Smith
-! http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.34.8435
-
-! SSA liveness must have been computed already
-
-:: (linear-scan) ( cfg machine-registers -- )
-    cfg number-instructions
-    cfg compute-live-intervals machine-registers allocate-registers
-    cfg assign-registers
-    cfg resolve-data-flow
-    cfg check-numbering ;
-
 : admissible-registers ( cfg -- regs )
     machine-registers swap frame-pointer?>> [
         [ [ frame-reg = not ] filter ] assoc-map
     ] when ;
 
+: allocate-and-assign-registers ( cfg -- )
+    [ ] [ compute-live-intervals ] [ admissible-registers ] tri
+    allocate-registers assign-registers ;
+
 : linear-scan ( cfg -- )
-    dup admissible-registers (linear-scan) ;
+    {
+        number-instructions
+        allocate-and-assign-registers
+        resolve-data-flow
+        check-numbering
+    } apply-passes ;