Big collection of patches for the new codegen branch.
[ghc-hetmet.git] / compiler / nativeGen / RegSpillCost.hs
index e639c67..6a2066a 100644 (file)
@@ -21,6 +21,7 @@ import RegLiveness
 import RegAllocInfo
 import MachInstrs
 import MachRegs
+import BlockId
 import Cmm
 
 import UniqFM
@@ -78,7 +79,7 @@ slurpSpillCostInfo cmm
        --      the info table from the CmmProc
        countBlock info (BasicBlock blockId instrs)
                | LiveInfo _ _ blockLive        <- info
-               , Just rsLiveEntry              <- lookupUFM blockLive blockId
+               , Just rsLiveEntry              <- lookupBlockEnv blockLive blockId
                = countLIs rsLiveEntry instrs
 
                | otherwise
@@ -132,7 +133,7 @@ chooseSpill
        -> Reg
 
 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))
                $ eltsUFM $ graphMap graph
 
@@ -177,14 +178,14 @@ chooseSpill info graph
 --  Without live range splitting, its's better to spill from the outside in so set the cost of very
 --     long live ranges to zero
 --
-
-spillCost
+{-
+spillCost_chaitin
        :: SpillCostInfo
        -> Graph Reg RegClass Reg
        -> Reg
        -> 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
        --      us at all - and we definately want to avoid trying to re-spill previously
        --      inserted spill code.
@@ -200,6 +201,21 @@ spillCost info graph reg
        | otherwise     = fromIntegral (uses + defs) / fromIntegral (nodeDegree graph reg)
        where (_, defs, uses, lifetime)
                = 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)