]> gitweb.factorcode.org Git - factor.git/commitdiff
compiler.cfg.linear-scan.*: change compute-live-intervals so that it
authorBjörn Lindqvist <bjourne@gmail.com>
Sun, 14 Jun 2015 06:53:00 +0000 (08:53 +0200)
committerBjörn Lindqvist <bjourne@gmail.com>
Sun, 14 Jun 2015 14:44:37 +0000 (16:44 +0200)
returns only one sequence, it makes some words a little simpler

basis/compiler/cfg/linear-scan/allocation/allocation.factor
basis/compiler/cfg/linear-scan/allocation/state/state-tests.factor
basis/compiler/cfg/linear-scan/allocation/state/state.factor
basis/compiler/cfg/linear-scan/debugger/debugger.factor
basis/compiler/cfg/linear-scan/linear-scan-tests.factor
basis/compiler/cfg/linear-scan/live-intervals/live-intervals-tests.factor
basis/compiler/cfg/linear-scan/live-intervals/live-intervals.factor

index a3298704336a3efc4eb7e3a7d834cd1b784883ef..7ad4f3a52775e16de9039ae23d6699a9dc7d2ccc 100644 (file)
@@ -63,6 +63,6 @@ M: sync-point handle ( sync-point -- )
     handled-intervals get
     active-intervals inactive-intervals [ get values concat ] bi@ 3append ;
 
-: allocate-registers ( live-intervals sync-point registers -- live-intervals' )
+: allocate-registers ( intervals/sync-point registers -- live-intervals' )
     init-allocator unhandled-min-heap get (allocate-registers)
     gather-intervals ;
index 4eb76c0c6a0842298d799efbbee38209a8436067..cde24f631d9af74d07badc32e0c737fe1703df57 100644 (file)
@@ -9,7 +9,7 @@ IN: compiler.cfg.linear-scan.allocation.state.tests
 {
     V{ T{ live-interval-state { reg-class int-regs } { vreg 123 } } }
 } [
-    f machine-registers init-allocator
+    f machine-registers init-allocator
     T{ live-interval-state { reg-class int-regs } { vreg 123 } }
     [ add-active ] keep active-intervals-for
 ] unit-test
@@ -29,7 +29,7 @@ IN: compiler.cfg.linear-scan.allocation.state.tests
         { float-regs V{ } }
     }
 } [
-    f machine-registers init-allocator
+    f machine-registers init-allocator
     T{ live-interval-state { reg-class int-regs } { vreg 123 } } add-active
     active-intervals get
 ] unit-test
@@ -164,8 +164,6 @@ cpu x86.64? [
         T{ live-interval-state { start 20 } { end 30 } }
         T{ live-interval-state { start 20 } { end 28 } }
         T{ live-interval-state { start 33 } { end 999 } }
-    }
-    {
         T{ sync-point { n 5 } }
         T{ sync-point { n 33 } }
         T{ sync-point { n 100 } }
@@ -177,5 +175,5 @@ cpu x86.64? [
     {
         T{ live-interval-state { start 20 } { end 30 } }
         T{ live-interval-state { start 20 } { end 30 } }
-    } { } >unhandled-min-heap heap-size
+    } >unhandled-min-heap heap-size
 ] unit-test
index c267f31709bd4fc2e6988adea58af98c1c041e7f..6d218e2c11e60470d3c02994e28456cc9fd744b1 100644 (file)
@@ -26,11 +26,8 @@ M: live-interval-state interval/sync-point-key
 M: sync-point interval/sync-point-key
     n>> 1/0. 1/0. 3array ;
 
-: zip-keyed ( seq quot: ( elt -- key ) -- alist )
-    [ keep ] curry { } map>assoc ; inline
-
-: >unhandled-min-heap ( live-intervals sync-points -- min-heap )
-    append [ interval/sync-point-key ] zip-keyed >min-heap ;
+: >unhandled-min-heap ( intervals/sync-points -- min-heap )
+    [ [ interval/sync-point-key ] keep 2array ] map >min-heap ;
 
 SYMBOL: registers
 
@@ -134,7 +131,7 @@ SYMBOL: spill-slots
 : lookup-spill-slot ( coalesced-vreg rep -- spill-slot )
     rep-size 2array spill-slots get ?at [ ] [ bad-vreg ] if ;
 
-: init-allocator ( live-intervals sync-points registers -- )
+: init-allocator ( intervals/sync-points registers -- )
     registers set
     >unhandled-min-heap unhandled-min-heap set
     [ V{ } clone ] reg-class-assoc active-intervals set
index cf68e12a4de6e867940e192af222612d62a18b69..9e87559ac2c1e10f33e6a0cd67af025dab84f06b 100644 (file)
@@ -10,7 +10,6 @@ IN: compiler.cfg.linear-scan.debugger
     [
         [ clone ] map dup [ [ vreg>> ] keep ] H{ } map>assoc
         live-intervals set
-        f
     ] dip
     allocate-registers drop ;
 
index 6efbeb3e2bc962a794d0ed26dfb58dc7f0323ca5..db0db01dbb402db348445bcbd6d7db5a8ff6dcbf 100644 (file)
@@ -40,7 +40,7 @@ V{
 : test-live-intervals ( -- )
     0 get block>cfg
     [ cfg set ] [ number-instructions ] [ compute-live-intervals ] tri
-    2drop ;
+    drop ;
 
 [ ] [
     H{
index 7c19b5b29a18a5cff4a896eb3f4d6e5003482bc5..2f4d51b606e1e50a0f9af835adf0d7bbd575c4e3 100644 (file)
@@ -1,4 +1,6 @@
-USING: compiler.cfg.linear-scan.live-intervals cpu.architecture kernel
+USING: arrays compiler.cfg compiler.cfg.linear-scan.live-intervals
+compiler.cfg.liveness compiler.cfg.registers
+compiler.cfg.ssa.destruction.leaders cpu.architecture kernel namespaces
 sequences tools.test ;
 IN: compiler.cfg.linear-scan.live-intervals.tests
 
@@ -14,3 +16,61 @@ IN: compiler.cfg.linear-scan.live-intervals.tests
     5 int-rep <live-interval> dup
     { { 5 10 } { 8 12 } } [ first2 rot add-range ] with each
 ] unit-test
+
+{
+    T{ live-interval-state
+       { vreg 5 }
+       { ranges V{ T{ live-range { from 5 } { to 12 } } } }
+       { uses V{ } }
+       { reg-class int-rep }
+    }
+} [
+    5 int-rep <live-interval> dup
+    { { 10 12 } { 5 10 } } [ first2 rot add-range ] with each
+] unit-test
+
+! handle-live-out
+{ } [
+    H{ } clone live-outs set
+    <basic-block> handle-live-out
+] unit-test
+
+{
+    H{
+        {
+            8
+            T{ live-interval-state
+               { vreg 8 }
+               { ranges V{ T{ live-range { from -10 } { to 23 } } } }
+               { uses V{ } }
+               { reg-class int-regs }
+            }
+        }
+        {
+            9
+            T{ live-interval-state
+               { vreg 9 }
+               { ranges V{ T{ live-range { from -10 } { to 23 } } } }
+               { uses V{ } }
+               { reg-class int-regs }
+            }
+        }
+        {
+            4
+            T{ live-interval-state
+               { vreg 4 }
+               { ranges V{ T{ live-range { from -10 } { to 23 } } } }
+               { uses V{ } }
+               { reg-class int-regs }
+            }
+        }
+    }
+} [
+    -10 from set
+    23 to set
+    init-live-intervals
+    H{ { 4 4 } { 8 8 } { 9 9 } } leader-map set
+    H{ { 4 int-rep } { 8 int-rep } { 9 int-rep } } representations set
+    <basic-block> [ H{ { 4 4 } { 8 8 } { 9 9 } } 2array 1array live-outs set ]
+    [ handle-live-out ] bi live-intervals get
+] unit-test
index 97211a91523f55a2324f7c1d230fda4251c6feec..82baf6d9252f9fcc8e4df43e745cbb0166427fd4 100644 (file)
@@ -154,10 +154,8 @@ M: hairy-clobber-insn compute-live-intervals* ( insn -- )
     2tri ;
 
 : handle-live-out ( bb -- )
-    live-out dup assoc-empty? [ drop ] [
-        [ from get to get ] dip keys
-        [ live-interval add-range ] 2with each
-    ] if ;
+    [ from get to get ] dip live-out keys
+    [ live-interval add-range ] 2with each ;
 
 TUPLE: sync-point n keep-dst? ;
 
@@ -202,8 +200,8 @@ ERROR: bad-live-interval live-interval ;
 : check-start ( live-interval -- )
     dup start>> -1 = [ bad-live-interval ] [ drop ] if ;
 
-: finish-live-intervals ( live-intervals -- seq )
-    values dup [
+: finish-live-intervals ( live-intervals -- )
+    [
         {
             [ [ { } like reverse! ] change-ranges drop ]
             [ [ { } like reverse! ] change-uses drop ]
@@ -212,12 +210,12 @@ ERROR: bad-live-interval live-interval ;
         } cleave
     ] each ;
 
-: compute-live-intervals ( cfg -- live-intervals sync-points )
+: compute-live-intervals ( cfg -- intervals/sync-points )
     init-live-intervals
-    linearization-order <reversed> [ kill-block?>> ] reject
+    linearization-order [ kill-block?>> ] reject <reversed>
     [ compute-live-intervals-step ] each
-    live-intervals get finish-live-intervals
-    sync-points get ;
+    live-intervals get values dup finish-live-intervals
+    sync-points get append ;
 
 : relevant-ranges ( interval1 interval2 -- ranges1 ranges2 )
     [ [ ranges>> ] bi@ ] [ nip start>> ] 2bi '[ to>> _ >= ] filter ;