compiler.cfg.linear-scan: two live intervals which are coalesced will use the same spill slot
parent
e0d84eb3a2
commit
d02854b04e
|
@ -38,10 +38,10 @@ ERROR: bad-live-ranges interval ;
|
||||||
} 2cleave ;
|
} 2cleave ;
|
||||||
|
|
||||||
: assign-spill ( live-interval -- )
|
: assign-spill ( live-interval -- )
|
||||||
dup vreg>> assign-spill-slot >>spill-to f >>split-next drop ;
|
dup assign-spill-slot >>spill-to f >>split-next drop ;
|
||||||
|
|
||||||
: assign-reload ( live-interval -- )
|
: assign-reload ( live-interval -- )
|
||||||
dup vreg>> assign-spill-slot >>reload-from drop ;
|
dup assign-spill-slot >>reload-from drop ;
|
||||||
|
|
||||||
: split-and-spill ( live-interval n -- before after )
|
: split-and-spill ( live-interval n -- before after )
|
||||||
split-for-spill 2dup [ assign-spill ] [ assign-reload ] bi* ;
|
split-for-spill 2dup [ assign-spill ] [ assign-reload ] bi* ;
|
||||||
|
|
|
@ -126,8 +126,18 @@ SYMBOL: spill-counts
|
||||||
! Mapping from vregs to spill slots
|
! Mapping from vregs to spill slots
|
||||||
SYMBOL: spill-slots
|
SYMBOL: spill-slots
|
||||||
|
|
||||||
: assign-spill-slot ( vreg -- n )
|
DEFER: assign-spill-slot
|
||||||
spill-slots get [ reg-class>> next-spill-slot ] cache ;
|
|
||||||
|
: compute-spill-slot ( live-interval -- n )
|
||||||
|
dup copy-from>>
|
||||||
|
[ assign-spill-slot ]
|
||||||
|
[ vreg>> reg-class>> next-spill-slot ] ?if ;
|
||||||
|
|
||||||
|
: assign-spill-slot ( live-interval -- n )
|
||||||
|
dup vreg>> spill-slots get at [ ] [
|
||||||
|
[ compute-spill-slot dup ] keep
|
||||||
|
vreg>> spill-slots get set-at
|
||||||
|
] ?if ;
|
||||||
|
|
||||||
: init-allocator ( registers -- )
|
: init-allocator ( registers -- )
|
||||||
registers set
|
registers set
|
||||||
|
|
|
@ -107,7 +107,7 @@ SYMBOL: check-assignment?
|
||||||
ERROR: overlapping-registers intervals ;
|
ERROR: overlapping-registers intervals ;
|
||||||
|
|
||||||
: check-assignment ( intervals -- )
|
: check-assignment ( intervals -- )
|
||||||
dup [ copy-from>> ] map sift '[ vreg>> _ member? not ] filter
|
dup [ copy-from>> ] map sift [ vreg>> ] map '[ vreg>> _ member? not ] filter
|
||||||
dup [ reg>> ] map all-unique? [ drop ] [ overlapping-registers ] if ;
|
dup [ reg>> ] map all-unique? [ drop ] [ overlapping-registers ] if ;
|
||||||
|
|
||||||
: active-intervals ( n -- intervals )
|
: active-intervals ( n -- intervals )
|
||||||
|
|
Loading…
Reference in New Issue