compiler.cfg.linear-scan: cleanups
parent
d23bb19b55
commit
43fc230c69
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ;
|
||||
|
|
|
@ -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 -- )
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 - ;
|
||||
|
|
|
@ -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?
|
||||
|
|
|
@ -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 ;
|
||||
|
|
|
@ -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 -- )
|
||||
|
|
Loading…
Reference in New Issue