compiler.cfg.linear-scan: assign spill slots to vregs globally, so that resolve pass never has to perform a memory->memory transfer

db4
Slava Pestov 2009-07-03 22:51:40 -05:00
parent d108324f19
commit d07c0429fc
2 changed files with 11 additions and 5 deletions

View File

@ -48,9 +48,7 @@ ERROR: bad-live-ranges interval ;
} 2cleave ;
: assign-spill ( live-interval -- live-interval )
dup reload-from>>
[ dup vreg>> reg-class>> next-spill-location ] unless*
>>spill-to ;
dup vreg>> assign-spill-slot >>spill-to ;
: assign-reload ( before after -- before after )
over spill-to>> >>reload-from ;

View File

@ -109,18 +109,26 @@ CONSTANT: reg-classes { int-regs double-float-regs }
: reg-class-assoc ( quot -- assoc )
[ reg-classes ] dip { } map>assoc ; inline
! Mapping from register classes to spill counts
SYMBOL: spill-counts
: next-spill-location ( reg-class -- n )
: next-spill-slot ( reg-class -- n )
spill-counts get [ dup 1 + ] change-at ;
! Mapping from vregs to spill slots
SYMBOL: spill-slots
: assign-spill-slot ( vreg -- n )
spill-slots get [ reg-class>> next-spill-slot ] cache ;
: init-allocator ( registers -- )
registers set
[ 0 ] reg-class-assoc spill-counts set
<min-heap> unhandled-intervals set
[ V{ } clone ] reg-class-assoc active-intervals set
[ V{ } clone ] reg-class-assoc inactive-intervals set
V{ } clone handled-intervals set
[ 0 ] reg-class-assoc spill-counts set
H{ } clone spill-slots set
-1 progress set ;
: init-unhandled ( live-intervals -- )