X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Futils%2FGraphColor.hs;h=8e7989dc8cd25dad20af42700c4d751aa3bfde0e;hb=f9fa73dd0f96280ddc73800ca8d247aa788561b5;hp=09fc5c26fa3c938c5c28372af79cb23879ef7ff4;hpb=26248badb45ed7865c55a5f12250b6f42eccf823;p=ghc-hetmet.git diff --git a/compiler/utils/GraphColor.hs b/compiler/utils/GraphColor.hs index 09fc5c2..8e7989d 100644 --- a/compiler/utils/GraphColor.hs +++ b/compiler/utils/GraphColor.hs @@ -1,9 +1,9 @@ +{-# OPTIONS -fno-warn-missing-signatures #-} -- | Graph Coloring. -- This is a generic graph coloring library, abstracted over the type of -- the node keys, nodes and colors. -- -{-# OPTIONS -fno-warn-missing-signatures #-} module GraphColor ( module GraphBase, @@ -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) @@ -138,7 +147,7 @@ colorScan_spin iterative triv spill graph -- if the graph is empty then we're done | isNullUFM $ graphMap graph - = (ksTriv, ksSpill, kksCoalesce) + = (ksTriv, ksSpill, reverse kksCoalesce) -- Simplify: -- Look for trivially colorable nodes. @@ -172,7 +181,7 @@ colorScan_spin iterative triv spill graph -- go back to Simplify and see if this frees up more nodes to be trivially colorable. (graph2, kksCoalesceFound @(_:_)) -> colorScan_spin iterative triv spill graph2 - ksTriv ksSpill (kksCoalesceFound ++ kksCoalesce) + ksTriv ksSpill (reverse kksCoalesceFound ++ kksCoalesce) -- Freeze: -- nothing could be coalesced (or was triv),