Tune coalescing in non-iterative register allocator
[ghc-hetmet.git] / compiler / utils / GraphColor.hs
index bd777b7..66eb0a1 100644 (file)
@@ -39,6 +39,7 @@ colorGraph
           , Eq color, Eq cls, Ord k
           , Outputable k, Outputable cls, Outputable color)
        => Bool                         -- ^ whether to do iterative coalescing
+       -> Int                          -- ^ how many times we've tried to color this graph so far.
        -> UniqFM (UniqSet color)       -- ^ map of (node class -> set of colors available for this class).
        -> Triv   k cls color           -- ^ fn to decide whether a node is trivially colorable.
        -> (Graph k cls color -> k)     -- ^ fn to choose a node to potentially leave uncolored if nothing is trivially colorable.
@@ -49,14 +50,22 @@ colorGraph
           , UniqFM  k )                -- map of regs (r1 -> r2) that were coaleced
                                        --       r1 should be replaced by r2 in the source
 
-colorGraph iterative colors triv spill graph0
+colorGraph iterative spinCount colors triv spill graph0
  = let
-       -- If we're not doing iterative coalescing then just do a conservative
-       --      coalescing stage at the front.
+       -- If we're not doing iterative coalescing then do an aggressive coalescing first time
+       --      around and then conservative coalescing for subsequent passes.
+       --
+       --      Aggressive coalescing is a quick way to get rid of many reg-reg moves. However, if
+       --      there is a lot of register pressure and we do it on every round then it can make the
+       --      graph less colorable and prevent the algorithm from converging in a sensible number
+       --      of cycles.
+       --
        (graph_coalesced, kksCoalesce1)
-               = if not iterative
-                       then coalesceGraph True triv graph0
-                       else (graph0, [])
+        = if iterative
+               then (graph0, [])
+               else if spinCount == 0
+                       then coalesceGraph True  triv graph0
+                       else coalesceGraph False triv graph0
 
        -- run the scanner to slurp out all the trivially colorable nodes
        --      (and do coalescing if iterative coalescing is enabled)