compiler.cfg.linear-scan.assignment: correct representation used when spilling

Previously the rep-of word was used. But as the vregs representation can
change, you need to instead use the representation it uas as the spill
point.
char-rename
Björn Lindqvist 2016-11-15 03:04:48 +01:00
parent 69acbbbefd
commit b89a305ef7
2 changed files with 11 additions and 6 deletions

View File

@ -179,7 +179,7 @@ IN: compiler.cfg.linear-scan.assignment.tests
} ;
{
V{ { RDI float-rep T{ spill-slot } } }
V{ { RDI int-rep T{ spill-slot } } }
} [
f f <basic-block> <cfg> cfg set
H{ } clone spill-slots set

View File

@ -112,14 +112,19 @@ RENAMING: assign [ vreg>reg ] [ vreg>reg ] [ vreg>reg ]
[ pending-interval-heap get heap-members ] 2dip
'[ _ _ spill-required? ] filter ;
: spill/reload ( interval -- {reg,rep,slot} )
[ reg>> ] [ vreg>> dup rep-of dup swapd assign-spill-slot ] bi 3array ;
: rep-at-insn ( n interval -- rep )
(find-use) [ def-rep>> ] [ use-rep>> ] bi or ;
: spill/reloads ( intervals -- spill/reloads )
[ spill/reload ] map ;
: spill/reload ( n interval -- {reg,rep,slot} )
[ rep-at-insn ] keep [ reg>> ] [ vreg>> ] bi
pick assign-spill-slot swapd 3array ;
: spill/reloads ( n intervals -- spill/reloads )
[ spill/reload ] with map ;
: spill/reloads-for-call-gc ( ##call-gc -- spill-seq )
[ gc-map>> gc-roots>> ] [ insn#>> ] bi spill-intervals spill/reloads ;
[ gc-map>> gc-roots>> ] [ insn#>> ] bi
[ spill-intervals ] keep swap spill/reloads ;
: emit-##call-gc ( insn -- )
dup spill/reloads-for-call-gc