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
parent
69acbbbefd
commit
b89a305ef7
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue