58 |
type raClient = |
type raClient = |
59 |
{ cellkind : C.cellkind, (* kind of register *) |
{ cellkind : C.cellkind, (* kind of register *) |
60 |
spillProh : (C.cell * C.cell) list, (* don't spill these *) |
spillProh : (C.cell * C.cell) list, (* don't spill these *) |
61 |
|
memRegs : (C.cell * C.cell) list, (* memory registers *) |
62 |
K : int, (* number of colors *) |
K : int, (* number of colors *) |
63 |
dedicated : bool Array.array, (* dedicated registers *) |
dedicated : bool Array.array, (* dedicated registers *) |
64 |
getreg : getreg, (* how to find a color *) |
getreg : getreg, (* how to find a color *) |
69 |
reload : F.Spill.reload, (* reload callback *) |
reload : F.Spill.reload, (* reload callback *) |
70 |
reloadDst : F.Spill.reloadDst, (* reload callback *) |
reloadDst : F.Spill.reloadDst, (* reload callback *) |
71 |
renameSrc : F.Spill.renameSrc, (* rename callback *) |
renameSrc : F.Spill.renameSrc, (* rename callback *) |
|
firstMemReg : C.cell, |
|
|
numMemRegs : int, |
|
72 |
mode : mode (* mode *) |
mode : mode (* mode *) |
73 |
} |
} |
74 |
|
|
142 |
fun regalloc{getreg, K, dedicated, copyInstr, |
fun regalloc{getreg, K, dedicated, copyInstr, |
143 |
spill, spillSrc, spillCopyTmp, renameSrc, |
spill, spillSrc, spillCopyTmp, renameSrc, |
144 |
reload, reloadDst, spillProh, cellkind, mode, |
reload, reloadDst, spillProh, cellkind, mode, |
145 |
firstMemReg, numMemRegs} = |
memRegs} = |
146 |
let val numCell = C.numCell cellkind () |
let val numCell = C.numCell cellkind () |
147 |
in if numCell = 0 |
in if numCell = 0 |
148 |
then () |
then () |
170 |
mode=Word.orb(Flowgraph.mode, |
mode=Word.orb(Flowgraph.mode, |
171 |
Word.orb(mode,SpillHeuristics.mode)), |
Word.orb(mode,SpillHeuristics.mode)), |
172 |
spillLoc=spillLoc, |
spillLoc=spillLoc, |
173 |
firstMemReg=firstMemReg, |
memRegs=memRegs |
|
numMemRegs=numMemRegs |
|
174 |
} |
} |
175 |
val G.GRAPH{spilledRegs, pseudoCount, spillFlag, ...} = G |
val G.GRAPH{spilledRegs, pseudoCount, spillFlag, ...} = G |
176 |
|
|
348 |
end |
end |
349 |
end |
end |
350 |
|
|
351 |
(* simplify the nodes *) |
val {spills} = |
352 |
|
if K = 0 then |
353 |
|
{spills=spillWkl} |
354 |
|
else |
355 |
|
let (* simplify the nodes *) |
356 |
val stack = iterate |
val stack = iterate |
357 |
(simplifyWkl,moveWkl,freezeWkl,spillWkl,stack) |
(simplifyWkl,moveWkl,freezeWkl,spillWkl,stack) |
358 |
(* color the nodes *) |
(* color the nodes *) |
359 |
val {spills} = (Core.select G) {stack=stack} |
in (Core.select G) {stack=stack} |
360 |
|
end |
361 |
in (* check for actual spills *) |
in (* check for actual spills *) |
362 |
case spills of |
case spills of |
363 |
[] => () |
[] => () |