Change spill cost function back to inverse length of live range.

On further testing it turns out that using Chaitin's spill cost formula
of counting the number of uses of a var and then dividing by the degree
of the node isn't actually a win. Perhaps because this isn't counting 
the number of actual spills inserted in the output code.

This would be worth revisiting if other work manages to increase the 
register pressure in the native code.
parent 0a50b1a7
...@@ -132,7 +132,7 @@ chooseSpill ...@@ -132,7 +132,7 @@ chooseSpill
-> Reg -> Reg
chooseSpill info graph chooseSpill info graph
= let cost = spillCost info graph = let cost = spillCost_length info graph
node = minimumBy (\n1 n2 -> compare (cost $ nodeId n1) (cost $ nodeId n2)) node = minimumBy (\n1 n2 -> compare (cost $ nodeId n1) (cost $ nodeId n2))
$ eltsUFM $ graphMap graph $ eltsUFM $ graphMap graph
...@@ -177,14 +177,14 @@ chooseSpill info graph ...@@ -177,14 +177,14 @@ chooseSpill info graph
-- Without live range splitting, its's better to spill from the outside in so set the cost of very -- Without live range splitting, its's better to spill from the outside in so set the cost of very
-- long live ranges to zero -- long live ranges to zero
-- --
{-
spillCost spillCost_chaitin
:: SpillCostInfo :: SpillCostInfo
-> Graph Reg RegClass Reg -> Graph Reg RegClass Reg
-> Reg -> Reg
-> Float -> Float
spillCost info graph reg spillCost_chaitin info graph reg
-- Spilling a live range that only lives for 1 instruction isn't going to help -- Spilling a live range that only lives for 1 instruction isn't going to help
-- us at all - and we definately want to avoid trying to re-spill previously -- us at all - and we definately want to avoid trying to re-spill previously
-- inserted spill code. -- inserted spill code.
...@@ -200,6 +200,21 @@ spillCost info graph reg ...@@ -200,6 +200,21 @@ spillCost info graph reg
| otherwise = fromIntegral (uses + defs) / fromIntegral (nodeDegree graph reg) | otherwise = fromIntegral (uses + defs) / fromIntegral (nodeDegree graph reg)
where (_, defs, uses, lifetime) where (_, defs, uses, lifetime)
= fromMaybe (reg, 0, 0, 0) $ lookupUFM info reg = fromMaybe (reg, 0, 0, 0) $ lookupUFM info reg
-}
-- Just spill the longest live range.
spillCost_length
:: SpillCostInfo
-> Graph Reg RegClass Reg
-> Reg
-> Float
spillCost_length info _ reg
| lifetime <= 1 = 1/0
| otherwise = 1 / fromIntegral lifetime
where (_, _, _, lifetime)
= fromMaybe (reg, 0, 0, 0) $ lookupUFM info reg
lifeMapFromSpillCostInfo :: SpillCostInfo -> UniqFM (Reg, Int) lifeMapFromSpillCostInfo :: SpillCostInfo -> UniqFM (Reg, Int)
......
...@@ -55,7 +55,7 @@ colorGraph iterative colors triv spill graph0 ...@@ -55,7 +55,7 @@ colorGraph iterative colors triv spill graph0
-- coalescing stage at the front. -- coalescing stage at the front.
(graph_coalesced, kksCoalesce1) (graph_coalesced, kksCoalesce1)
= if not iterative = if not iterative
then coalesceGraph False triv graph0 then coalesceGraph True triv graph0
else (graph0, []) else (graph0, [])
-- run the scanner to slurp out all the trivially colorable nodes -- run the scanner to slurp out all the trivially colorable nodes
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment