]> gitweb.factorcode.org Git - factor.git/commitdiff
compiler.cfg.linear-scan: cleanups
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Wed, 28 Apr 2010 07:35:46 +0000 (03:35 -0400)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Mon, 3 May 2010 21:34:18 +0000 (17:34 -0400)
basis/compiler/cfg/build-stack-frame/build-stack-frame.factor
basis/compiler/cfg/instructions/instructions.factor
basis/compiler/cfg/linear-scan/allocation/allocation.factor
basis/compiler/cfg/linear-scan/allocation/spilling/spilling.factor
basis/compiler/cfg/linear-scan/allocation/state/state.factor
basis/compiler/cfg/linear-scan/assignment/assignment.factor
basis/compiler/cfg/linear-scan/linear-scan-tests.factor
basis/compiler/cfg/linear-scan/live-intervals/live-intervals.factor
basis/compiler/cfg/linear-scan/resolve/resolve-tests.factor
basis/compiler/cfg/linear-scan/resolve/resolve.factor
basis/compiler/codegen/codegen.factor

index cb5e9aaf3d900643671eef949ef583013aca3a65..49dfb95164c2094548e5f1d4960bff47672d827e 100644 (file)
@@ -39,7 +39,7 @@ M: insn compute-stack-frame*
     ] when ;
 
 ! PowerPC backend sets frame-required? for ##integer>float!
-\ _spill t frame-required? set-word-prop
+\ ##spill t frame-required? set-word-prop
 \ ##unary-float-function t frame-required? set-word-prop
 \ ##binary-float-function t frame-required? set-word-prop
 
index db1496f147b2aa4da37864ec4ef99530bb775af2..5286fd861b088255697e9de6cbc460d98d872016 100644 (file)
@@ -706,7 +706,22 @@ temp: temp1/int-rep temp2/int-rep ;
 INSN: ##call-gc
 literal: gc-roots ;
 
+! Spills and reloads, inserted by register allocator
+TUPLE: spill-slot { n integer } ;
+C: <spill-slot> spill-slot
+
+INSN: ##spill
+use: src
+literal: rep dst ;
+
+INSN: ##reload
+def: dst
+literal: rep src ;
+
 ! Instructions used by machine IR only.
+INSN: _spill-area-size
+literal: n ;
+
 INSN: _prologue
 literal: stack-frame ;
 
@@ -727,20 +742,6 @@ literal: label ;
 INSN: _conditional-branch
 literal: label insn ;
 
-TUPLE: spill-slot { n integer } ;
-C: <spill-slot> spill-slot
-
-INSN: _spill
-use: src
-literal: rep dst ;
-
-INSN: _reload
-def: dst
-literal: rep src ;
-
-INSN: _spill-area-size
-literal: n ;
-
 UNION: ##allocation
 ##allot
 ##box-alien
index 764e37786f87d1472d68cb348884df55c001fc42..ed7690bd773170cf54dbf6557176af23feec3a7b 100644 (file)
@@ -9,11 +9,11 @@ compiler.cfg.linear-scan.allocation.state ;
 IN: compiler.cfg.linear-scan.allocation
 
 : active-positions ( new assoc -- )
-    [ vreg>> active-intervals-for ] dip
+    [ active-intervals-for ] dip
     '[ [ 0 ] dip reg>> _ add-use-position ] each ;
 
 : inactive-positions ( new assoc -- )
-    [ [ vreg>> inactive-intervals-for ] keep ] dip
+    [ [ inactive-intervals-for ] keep ] dip
     '[
         [ _ relevant-ranges intersect-live-ranges 1/0. or ] [ reg>> ] bi
         _ add-use-position
index a914aab4bfc7ea2c8a7ad9b5fdf00edbcec380fb..fdba952d4a264af669c581d5eeac86e65beb43c0 100644 (file)
@@ -17,13 +17,13 @@ ERROR: bad-live-ranges interval ;
     ] [ drop ] if ;
 
 : trim-before-ranges ( live-interval -- )
-    [ ranges>> ] [ uses>> last n>> 1 + ] bi
+    [ ranges>> ] [ last-use n>> 1 + ] bi
     [ '[ from>> _ <= ] filter! drop ]
     [ swap last (>>to) ]
     2bi ;
 
 : trim-after-ranges ( live-interval -- )
-    [ ranges>> ] [ uses>> first n>> ] bi
+    [ ranges>> ] [ first-use n>> ] bi
     [ '[ to>> _ >= ] filter! drop ]
     [ swap first (>>from) ]
     2bi ;
@@ -73,12 +73,12 @@ ERROR: bad-live-ranges interval ;
     '[ [ _ find-use-position ] [ reg>> ] bi _ add-use-position ] each ;
 
 : active-positions ( new assoc -- )
-    [ [ vreg>> active-intervals-for ] keep ] dip
+    [ [ active-intervals-for ] keep ] dip
     find-use-positions ;
 
 : inactive-positions ( new assoc -- )
     [
-        [ vreg>> inactive-intervals-for ] keep
+        [ inactive-intervals-for ] keep
         [ '[ _ intervals-intersect? ] filter ] keep
     ] dip
     find-use-positions ;
@@ -89,7 +89,7 @@ ERROR: bad-live-ranges interval ;
     >alist alist-max ;
 
 : spill-new? ( new pair -- ? )
-    [ uses>> first n>> ] [ second ] bi* > ;
+    [ first-use n>> ] [ second ] bi* > ;
 
 : spill-new ( new pair -- )
     drop spill-after add-unhandled ;
@@ -103,13 +103,13 @@ ERROR: bad-live-ranges interval ;
     ! If there is an active interval using 'reg' (there should be at
     ! most one) are split and spilled and removed from the inactive
     ! set.
-    new vreg>> active-intervals-for [ [ reg>> reg = ] find swap dup ] keep
+    new active-intervals-for [ [ reg>> reg = ] find swap dup ] keep
     '[ _ remove-nth! drop  new start>> spill ] [ 2drop ] if ;
 
 :: spill-intersecting-inactive ( new reg -- )
     ! Any inactive intervals using 'reg' are split and spilled
     ! and removed from the inactive set.
-    new vreg>> inactive-intervals-for [
+    new inactive-intervals-for [
         dup reg>> reg = [
             dup new intervals-intersect? [
                 new start>> spill f
index 4c825c9d7ce62c9c6eab8be06c3e9186a67096f3..06365b0ed255a96d8c53ec9f36eee38f5cc8ff70 100644 (file)
@@ -26,14 +26,14 @@ SYMBOL: registers
 ! Vector of active live intervals
 SYMBOL: active-intervals
 
-: active-intervals-for ( vreg -- seq )
-    rep-of reg-class-of active-intervals get at ;
+: active-intervals-for ( live-interval -- seq )
+    reg-class>> active-intervals get at ;
 
 : add-active ( live-interval -- )
-    dup vreg>> active-intervals-for push ;
+    dup active-intervals-for push ;
 
 : delete-active ( live-interval -- )
-    dup vreg>> active-intervals-for remove-eq! drop ;
+    dup active-intervals-for remove-eq! drop ;
 
 : assign-free-register ( new registers -- )
     pop >>reg add-active ;
@@ -41,14 +41,14 @@ SYMBOL: active-intervals
 ! Vector of inactive live intervals
 SYMBOL: inactive-intervals
 
-: inactive-intervals-for ( vreg -- seq )
-    rep-of reg-class-of inactive-intervals get at ;
+: inactive-intervals-for ( live-interval -- seq )
+    reg-class>> inactive-intervals get at ;
 
 : add-inactive ( live-interval -- )
-    dup vreg>> inactive-intervals-for push ;
+    dup inactive-intervals-for push ;
 
 : delete-inactive ( live-interval -- )
-    dup vreg>> inactive-intervals-for remove-eq! drop ;
+    dup inactive-intervals-for remove-eq! drop ;
 
 ! Vector of handled live intervals
 SYMBOL: handled-intervals
@@ -67,7 +67,7 @@ ERROR: register-already-used live-interval ;
 
 : check-activate ( live-interval -- )
     check-allocation? get [
-        dup [ reg>> ] [ vreg>> active-intervals-for [ reg>> ] map ] bi member?
+        dup [ reg>> ] [ active-intervals-for [ reg>> ] map ] bi member?
         [ register-already-used ] [ drop ] if
     ] [ drop ] if ;
 
@@ -148,7 +148,7 @@ SYMBOL: spill-slots
 
 ! A utility used by register-status and spill-status words
 : free-positions ( new -- assoc )
-    vreg>> rep-of reg-class-of registers get at
+    reg-class>> registers get at
     [ 1/0. ] H{ } <linked-assoc> map>assoc ;
 
 : add-use-position ( n reg assoc -- ) [ [ min ] when* ] change-at ;
index 6cceea33031a8ac664173e581251a3ea2fcdc84a..7c0f38a44ed0ea50af37b9210b66a3d8d03db604 100644 (file)
@@ -68,8 +68,10 @@ SYMBOL: register-live-outs
     H{ } clone register-live-outs set
     init-unhandled ;
 
+: spill-rep ( live-interval -- rep ) vreg>> rep-of ;
+
 : insert-spill ( live-interval -- )
-    [ reg>> ] [ vreg>> rep-of ] [ spill-to>> ] tri _spill ;
+    [ reg>> ] [ spill-rep ] [ spill-to>> ] tri ##spill ;
 
 : handle-spill ( live-interval -- )
     dup spill-to>> [ insert-spill ] [ drop ] if ;
@@ -88,15 +90,17 @@ SYMBOL: register-live-outs
 : expire-old-intervals ( n -- )
     pending-interval-heap get (expire-old-intervals) ;
 
+: reload-rep ( live-interval -- rep ) vreg>> rep-of ;
+
 : insert-reload ( live-interval -- )
-    [ reg>> ] [ vreg>> rep-of ] [ reload-from>> ] tri _reload ;
+    [ reg>> ] [ reload-rep ] [ reload-from>> ] tri ##reload ;
 
 : insert-reload? ( live-interval -- ? )
     ! Don't insert a reload if the register will be written to
     ! before being read again.
     {
         [ reload-from>> ]
-        [ uses>> first type>> +use+ eq? ]
+        [ first-use type>> +use+ eq? ]
     } 1&& ;
 
 : handle-reload ( live-interval -- )
index 3bf7dd827ceb90d4b697200b023db56980c1020e..a0f6b9f5c528e6a2402d87f1f390381c540e03d3 100644 (file)
@@ -89,6 +89,7 @@ H{
 [
     T{ live-interval
        { vreg 1 }
+       { reg-class float-regs }
        { start 0 }
        { end 2 }
        { uses V{ T{ vreg-use f 0 } T{ vreg-use f 1 } } }
@@ -97,6 +98,7 @@ H{
     }
     T{ live-interval
        { vreg 1 }
+       { reg-class float-regs }
        { start 5 }
        { end 5 }
        { uses V{ T{ vreg-use f 5 } } }
@@ -106,6 +108,7 @@ H{
 ] [
     T{ live-interval
        { vreg 1 }
+       { reg-class float-regs }
        { start 0 }
        { end 5 }
        { uses V{ T{ vreg-use f 0 } T{ vreg-use f 1 } T{ vreg-use f 5 } } }
@@ -116,6 +119,7 @@ H{
 [
     T{ live-interval
        { vreg 2 }
+       { reg-class float-regs }
        { start 0 }
        { end 1 }
        { uses V{ T{ vreg-use f 0 } } }
@@ -124,6 +128,7 @@ H{
     }
     T{ live-interval
        { vreg 2 }
+       { reg-class float-regs }
        { start 1 }
        { end 5 }
        { uses V{ T{ vreg-use f 1 } T{ vreg-use f 5 } } }
@@ -133,6 +138,7 @@ H{
 ] [
     T{ live-interval
        { vreg 2 }
+       { reg-class float-regs }
        { start 0 }
        { end 5 }
        { uses V{ T{ vreg-use f 0 } T{ vreg-use f 1 } T{ vreg-use f 5 } } }
@@ -143,6 +149,7 @@ H{
 [
     T{ live-interval
        { vreg 3 }
+       { reg-class float-regs }
        { start 0 }
        { end 1 }
        { uses V{ T{ vreg-use f 0 } } }
@@ -151,6 +158,7 @@ H{
     }
     T{ live-interval
        { vreg 3 }
+       { reg-class float-regs }
        { start 20 }
        { end 30 }
        { uses V{ T{ vreg-use f 20 } T{ vreg-use f 30 } } }
@@ -160,6 +168,7 @@ H{
 ] [
     T{ live-interval
        { vreg 3 }
+       { reg-class float-regs }
        { start 0 }
        { end 30 }
        { uses V{ T{ vreg-use f 0 } T{ vreg-use f 20 } T{ vreg-use f 30 } } }
@@ -184,6 +193,7 @@ H{
           V{
               T{ live-interval
                  { vreg 1 }
+                 { reg-class int-regs }
                  { reg 1 }
                  { start 1 }
                  { end 15 }
@@ -191,6 +201,7 @@ H{
               }
               T{ live-interval
                  { vreg 2 }
+                 { reg-class int-regs }
                  { reg 2 }
                  { start 3 }
                  { end 8 }
@@ -198,6 +209,7 @@ H{
               }
               T{ live-interval
                  { vreg 3 }
+                 { reg-class int-regs }
                  { reg 3 }
                  { start 3 }
                  { end 10 }
@@ -209,6 +221,7 @@ H{
     H{ } inactive-intervals set
     T{ live-interval
         { vreg 1 }
+        { reg-class int-regs }
         { start 5 }
         { end 5 }
         { uses V{ T{ vreg-use f 5 } } }
@@ -227,6 +240,7 @@ H{
           V{
               T{ live-interval
                  { vreg 1 }
+                 { reg-class int-regs }
                  { reg 1 }
                  { start 1 }
                  { end 15 }
@@ -234,6 +248,7 @@ H{
               }
               T{ live-interval
                  { vreg 2 }
+                 { reg-class int-regs }
                  { reg 2 }
                  { start 3 }
                  { end 8 }
@@ -245,6 +260,7 @@ H{
     H{ } inactive-intervals set
     T{ live-interval
         { vreg 3 }
+        { reg-class int-regs }
         { start 5 }
         { end 5 }
         { uses V{ T{ vreg-use f 5 } } }
@@ -258,6 +274,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
     {
         T{ live-interval
            { vreg 1 }
+           { reg-class int-regs }
            { start 0 }
            { end 100 }
            { uses V{ T{ vreg-use f 0 } T{ vreg-use f 100 } } }
@@ -272,6 +289,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
     {
         T{ live-interval
            { vreg 1 }
+           { reg-class int-regs }
            { start 0 }
            { end 10 }
            { uses V{ T{ vreg-use f 0 } T{ vreg-use f 10 } } }
@@ -279,6 +297,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
         }
         T{ live-interval
            { vreg 2 }
+           { reg-class int-regs }
            { start 11 }
            { end 20 }
            { uses V{ T{ vreg-use f 11 } T{ vreg-use f 20 } } }
@@ -293,6 +312,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
     {
         T{ live-interval
            { vreg 1 }
+           { reg-class int-regs }
            { start 0 }
            { end 100 }
            { uses V{ T{ vreg-use f 0 } T{ vreg-use f 100 } } }
@@ -300,6 +320,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
         }
         T{ live-interval
            { vreg 2 }
+           { reg-class int-regs }
            { start 30 }
            { end 60 }
            { uses V{ T{ vreg-use f 30 } T{ vreg-use f 60 } } }
@@ -314,6 +335,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
     {
         T{ live-interval
            { vreg 1 }
+           { reg-class int-regs }
            { start 0 }
            { end 100 }
            { uses V{ T{ vreg-use f 0 } T{ vreg-use f 100 } } }
@@ -321,6 +343,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
         }
         T{ live-interval
            { vreg 2 }
+           { reg-class int-regs }
            { start 30 }
            { end 200 }
            { uses V{ T{ vreg-use f 30 } T{ vreg-use f 200 } } }
@@ -335,6 +358,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
     {
         T{ live-interval
            { vreg 1 }
+           { reg-class int-regs }
            { start 0 }
            { end 100 }
            { uses V{ T{ vreg-use f 0 } T{ vreg-use f 100 } } }
@@ -342,6 +366,7 @@ H{ { 1 int-rep } { 2 int-rep } } representations set
         }
         T{ live-interval
            { vreg 2 }
+           { reg-class int-regs }
            { start 30 }
            { end 100 }
            { uses V{ T{ vreg-use f 30 } T{ vreg-use f 100 } } }
@@ -365,6 +390,7 @@ H{
     {
         T{ live-interval
            { vreg 1 }
+           { reg-class int-regs }
            { start 0 }
            { end 20 }
            { uses V{ T{ vreg-use f 0 } T{ vreg-use f 10 } T{ vreg-use f 20 } } }
@@ -372,6 +398,7 @@ H{
         }
         T{ live-interval
            { vreg 2 }
+           { reg-class int-regs }
            { start 0 }
            { end 20 }
            { uses V{ T{ vreg-use f 0 } T{ vreg-use f 10 } T{ vreg-use f 20 } } }
@@ -379,6 +406,7 @@ H{
         }
         T{ live-interval
            { vreg 3 }
+           { reg-class int-regs }
            { start 4 }
            { end 8 }
            { uses V{ T{ vreg-use f 6 } } }
@@ -386,6 +414,7 @@ H{
         }
         T{ live-interval
            { vreg 4 }
+           { reg-class int-regs }
            { start 4 }
            { end 8 }
            { uses V{ T{ vreg-use f 8 } } }
@@ -395,6 +424,7 @@ H{
         ! This guy will invoke the 'spill partially available' code path
         T{ live-interval
            { vreg 5 }
+           { reg-class int-regs }
            { start 4 }
            { end 8 }
            { uses V{ T{ vreg-use f 8 } } }
@@ -411,6 +441,7 @@ H{
     {
         T{ live-interval
            { vreg 1 }
+           { reg-class int-regs }
            { start 0 }
            { end 10 }
            { uses V{ T{ vreg-use f 0 } T{ vreg-use f 6 } T{ vreg-use f 10 } } }
@@ -420,6 +451,7 @@ H{
         ! This guy will invoke the 'spill new' code path
         T{ live-interval
            { vreg 5 }
+           { reg-class int-regs }
            { start 2 }
            { end 8 }
            { uses V{ T{ vreg-use f 8 } } }
@@ -491,12 +523,14 @@ H{
 [ 5 ] [
     T{ live-interval
        { start 0 }
+       { reg-class int-regs }
        { end 10 }
        { uses { 0 10 } }
        { ranges V{ T{ live-range f 0 10 } } }
     }
     T{ live-interval
        { start 5 }
+       { reg-class int-regs }
        { end 10 }
        { uses { 5 10 } }
        { ranges V{ T{ live-range f 5 10 } } }
@@ -520,6 +554,7 @@ H{
           {
               T{ live-interval
                  { vreg 1 }
+                 { reg-class int-regs }
                  { start 0 }
                  { end 20 }
                  { reg 0 }
@@ -529,6 +564,7 @@ H{
 
               T{ live-interval
                  { vreg 2 }
+                 { reg-class int-regs }
                  { start 4 }
                  { end 40 }
                  { reg 0 }
@@ -543,6 +579,7 @@ H{
           {
               T{ live-interval
                  { vreg 3 }
+                 { reg-class int-regs }
                  { start 0 }
                  { end 40 }
                  { reg 1 }
@@ -554,7 +591,8 @@ H{
     } active-intervals set
 
     T{ live-interval
-       { vreg 4 }
+        { vreg 4 }
+        { reg-class int-regs }
         { start 8 }
         { end 10 }
         { ranges V{ T{ live-range f 8 10 } } }
@@ -924,13 +962,13 @@ test-diamond
 
 [ ] [ { 1 2 } test-linear-scan-on-cfg ] unit-test
 
-[ _spill ] [ 2 get successors>> first instructions>> first class ] unit-test
+[ ##spill ] [ 2 get successors>> first instructions>> first class ] unit-test
 
-[ _spill ] [ 3 get instructions>> second class ] unit-test
+[ ##spill ] [ 3 get instructions>> second class ] unit-test
 
-[ f ] [ 3 get instructions>> [ _reload? ] any? ] unit-test
+[ f ] [ 3 get instructions>> [ ##reload? ] any? ] unit-test
 
-[ _reload ] [ 4 get instructions>> first class ] unit-test
+[ ##reload ] [ 4 get instructions>> first class ] unit-test
 
 ! Resolve pass
 V{
@@ -978,11 +1016,11 @@ V{
 
 [ ] [ { 1 2 } test-linear-scan-on-cfg ] unit-test
 
-[ t ] [ 2 get instructions>> [ _spill? ] any? ] unit-test
+[ t ] [ 2 get instructions>> [ ##spill? ] any? ] unit-test
 
-[ t ] [ 3 get predecessors>> first instructions>> [ _spill? ] any? ] unit-test
+[ t ] [ 3 get predecessors>> first instructions>> [ ##spill? ] any? ] unit-test
 
-[ t ] [ 5 get instructions>> [ _reload? ] any? ] unit-test
+[ t ] [ 5 get instructions>> [ ##reload? ] any? ] unit-test
 
 ! A more complicated failure case with resolve that came up after the above
 ! got fixed
@@ -1041,13 +1079,13 @@ V{
 
 [ ] [ { 1 2 3 4 } test-linear-scan-on-cfg ] unit-test
 
-[ _spill ] [ 1 get instructions>> second class ] unit-test
-[ _reload ] [ 4 get instructions>> 4 swap nth class ] unit-test
-[ V{ 3 2 1 } ] [ 8 get instructions>> [ _spill? ] filter [ dst>> n>> cell / ] map ] unit-test
-[ V{ 3 2 1 } ] [ 9 get instructions>> [ _reload? ] filter [ src>> n>> cell / ] map ] unit-test
+[ ##spill ] [ 1 get instructions>> second class ] unit-test
+[ ##reload ] [ 4 get instructions>> 4 swap nth class ] unit-test
+[ V{ 3 2 1 } ] [ 8 get instructions>> [ ##spill? ] filter [ dst>> n>> cell / ] map ] unit-test
+[ V{ 3 2 1 } ] [ 9 get instructions>> [ ##reload? ] filter [ src>> n>> cell / ] map ] unit-test
 
 ! Resolve pass should insert this
-[ _reload ] [ 5 get predecessors>> first instructions>> first class ] unit-test
+[ ##reload ] [ 5 get predecessors>> first instructions>> first class ] unit-test
 
 ! Some random bug
 V{
@@ -1397,13 +1435,13 @@ test-diamond
 
 [ ] [ { 1 2 } test-linear-scan-on-cfg ] unit-test
 
-[ 0 ] [ 1 get instructions>> [ _spill? ] count ] unit-test
+[ 0 ] [ 1 get instructions>> [ ##spill? ] count ] unit-test
 
-[ 1 ] [ 2 get instructions>> [ _spill? ] count ] unit-test
+[ 1 ] [ 2 get instructions>> [ ##spill? ] count ] unit-test
 
-[ 1 ] [ 3 get predecessors>> first instructions>> [ _spill? ] count ] unit-test
+[ 1 ] [ 3 get predecessors>> first instructions>> [ ##spill? ] count ] unit-test
 
-[ 1 ] [ 4 get instructions>> [ _reload? ] count ] unit-test
+[ 1 ] [ 4 get instructions>> [ ##reload? ] count ] unit-test
 
 ! Another test case for fencepost error in assignment pass
 V{ T{ ##branch } } 0 test-bb
@@ -1435,12 +1473,12 @@ test-diamond
 
 [ ] [ { 1 2 } test-linear-scan-on-cfg ] unit-test
 
-[ 0 ] [ 1 get instructions>> [ _spill? ] count ] unit-test
+[ 0 ] [ 1 get instructions>> [ ##spill? ] count ] unit-test
 
-[ 1 ] [ 2 get instructions>> [ _spill? ] count ] unit-test
+[ 1 ] [ 2 get instructions>> [ ##spill? ] count ] unit-test
 
-[ 1 ] [ 2 get instructions>> [ _reload? ] count ] unit-test
+[ 1 ] [ 2 get instructions>> [ ##reload? ] count ] unit-test
 
-[ 0 ] [ 3 get instructions>> [ _spill? ] count ] unit-test
+[ 0 ] [ 3 get instructions>> [ ##spill? ] count ] unit-test
 
-[ 0 ] [ 4 get instructions>> [ _reload? ] count ] unit-test
+[ 0 ] [ 4 get instructions>> [ ##reload? ] count ] unit-test
index da079da0e469fc9ad3aba08046d4c3170f1921b3..62b23ddde9055e44e2e0d3307029bc2ebf89b32c 100644 (file)
@@ -3,7 +3,7 @@
 USING: namespaces kernel assocs accessors sequences math math.order fry
 combinators binary-search compiler.cfg.instructions compiler.cfg.registers
 compiler.cfg.def-use compiler.cfg.liveness compiler.cfg.linearization.order
-compiler.cfg ;
+compiler.cfg cpu.architecture ;
 IN: compiler.cfg.linear-scan.live-intervals
 
 TUPLE: live-range from to ;
@@ -19,7 +19,12 @@ C: <vreg-use> vreg-use
 TUPLE: live-interval
 vreg
 reg spill-to reload-from
-start end ranges uses ;
+start end ranges uses
+reg-class ;
+
+: first-use ( live-interval -- use ) uses>> first ; inline
+
+: last-use ( live-interval -- use ) uses>> last ; inline
 
 GENERIC: covers? ( insn# obj -- ? )
 
@@ -66,6 +71,7 @@ M: live-interval covers? ( insn# live-interval -- ? )
     \ live-interval new
         V{ } clone >>uses
         V{ } clone >>ranges
+        over rep-of reg-class-of >>reg-class
         swap >>vreg ;
 
 : block-from ( bb -- n ) instructions>> first insn#>> 1 - ;
index f16c6082930e50685a5f4e12887d933be3655f15..7aff066e0ba0449432373c8df1c589ac70ad6ac2 100644 (file)
@@ -20,7 +20,7 @@ IN: compiler.cfg.linear-scan.resolve.tests
 
 [
     {
-        T{ _reload { dst 1 } { rep int-rep } { src T{ spill-slot f 0 } } }
+        T{ ##reload { dst 1 } { rep int-rep } { src T{ spill-slot f 0 } } }
     }
 ] [
     [
@@ -32,7 +32,7 @@ IN: compiler.cfg.linear-scan.resolve.tests
 
 [
     {
-        T{ _spill { src 1 } { rep int-rep } { dst T{ spill-slot f 0 } } }
+        T{ ##spill { src 1 } { rep int-rep } { dst T{ spill-slot f 0 } } }
     }
 ] [
     [
@@ -66,8 +66,8 @@ IN: compiler.cfg.linear-scan.resolve.tests
 
 [
     {
-        T{ _spill { src 0 } { rep int-rep } { dst T{ spill-slot f 0 } } }
-        T{ _reload { dst 0 } { rep tagged-rep } { src T{ spill-slot f 1 } } }
+        T{ ##spill { src 0 } { rep int-rep } { dst T{ spill-slot f 0 } } }
+        T{ ##reload { dst 0 } { rep tagged-rep } { src T{ spill-slot f 1 } } }
         T{ ##branch }
     }
 ] [
@@ -80,8 +80,8 @@ IN: compiler.cfg.linear-scan.resolve.tests
 
 [
     {
-        T{ _spill { src 0 } { rep int-rep } { dst T{ spill-slot f 1 } } }
-        T{ _reload { dst 0 } { rep tagged-rep } { src T{ spill-slot f 0 } } }
+        T{ ##spill { src 0 } { rep int-rep } { dst T{ spill-slot f 1 } } }
+        T{ ##reload { dst 0 } { rep tagged-rep } { src T{ spill-slot f 0 } } }
         T{ ##branch }
     }
 ] [
@@ -94,8 +94,8 @@ IN: compiler.cfg.linear-scan.resolve.tests
 
 [
     {
-        T{ _spill { src 0 } { rep int-rep } { dst T{ spill-slot f 1 } } }
-        T{ _reload { dst 0 } { rep tagged-rep } { src T{ spill-slot f 0 } } }
+        T{ ##spill { src 0 } { rep int-rep } { dst T{ spill-slot f 1 } } }
+        T{ ##reload { dst 0 } { rep tagged-rep } { src T{ spill-slot f 0 } } }
         T{ ##branch }
     }
 ] [
@@ -116,15 +116,15 @@ H{ } clone spill-temps set
     }
     mapping-instructions {
         {
-            T{ _spill { src 0 } { rep int-rep } { dst T{ spill-slot f 8 } } }
+            T{ ##spill { src 0 } { rep int-rep } { dst T{ spill-slot f 8 } } }
             T{ ##copy { dst 0 } { src 1 } { rep int-rep } }
-            T{ _reload { dst 1 } { rep int-rep } { src T{ spill-slot f 8 } } }
+            T{ ##reload { dst 1 } { rep int-rep } { src T{ spill-slot f 8 } } }
             T{ ##branch }
         }
         {
-            T{ _spill { src 1 } { rep int-rep } { dst T{ spill-slot f 8 } } }
+            T{ ##spill { src 1 } { rep int-rep } { dst T{ spill-slot f 8 } } }
             T{ ##copy { dst 1 } { src 0 } { rep int-rep } }
-            T{ _reload { dst 0 } { rep int-rep } { src T{ spill-slot f 8 } } }
+            T{ ##reload { dst 0 } { rep int-rep } { src T{ spill-slot f 8 } } }
             T{ ##branch }
         }
     } member?
index b450145bd4c556cc5e8bacb085eba262eea6844d..02c08d5c397aa12ead08c9d1e9046cf54b981cfb 100644 (file)
@@ -51,16 +51,16 @@ SYMBOL: spill-temps
     ] if ;
 
 : memory->register ( from to -- )
-    swap [ reg>> ] [ [ rep>> ] [ reg>> ] bi ] bi* _reload ;
+    swap [ reg>> ] [ [ rep>> ] [ reg>> ] bi ] bi* ##reload ;
 
 : register->memory ( from to -- )
-    [ [ reg>> ] [ rep>> ] bi ] [ reg>> ] bi* _spill ;
+    [ [ reg>> ] [ rep>> ] bi ] [ reg>> ] bi* ##spill ;
 
 : temp->register ( from to -- )
-    nip [ reg>> ] [ rep>> ] [ rep>> spill-temp ] tri _reload ;
+    nip [ reg>> ] [ rep>> ] [ rep>> spill-temp ] tri ##reload ;
 
 : register->temp ( from to -- )
-    drop [ [ reg>> ] [ rep>> ] bi ] [ rep>> spill-temp ] bi _spill ;
+    drop [ [ reg>> ] [ rep>> ] bi ] [ rep>> spill-temp ] bi ##spill ;
 
 : register->register ( from to -- )
     swap [ reg>> ] [ [ reg>> ] [ rep>> ] bi ] bi* ##copy ;
index 3a101092b27cac26348a57e600ac57e612e4974e..2d0cfa82893e0c6ddf3c603a41c4d677c241c13b 100755 (executable)
@@ -200,7 +200,8 @@ CODEGEN: ##vm-field %vm-field
 CODEGEN: ##set-vm-field %set-vm-field
 CODEGEN: ##alien-global %alien-global
 CODEGEN: ##call-gc %call-gc
-
+CODEGEN: ##spill %spill
+CODEGEN: ##reload %reload
 CODEGEN: ##dispatch %dispatch
 
 : %dispatch-label ( label -- )
@@ -210,8 +211,6 @@ CODEGEN: ##dispatch %dispatch
 CODEGEN: _label resolve-label
 CODEGEN: _dispatch-label %dispatch-label
 CODEGEN: _branch %jump-label
-CODEGEN: _spill %spill
-CODEGEN: _reload %reload
 CODEGEN: _loop-entry %loop-entry
 
 GENERIC: generate-conditional-insn ( label insn -- )