summaryrefslogtreecommitdiff
path: root/compiler/utils/GraphColor.hs
diff options
context:
space:
mode:
authorBen.Lippmeier@anu.edu.au <unknown>2009-05-18 01:44:44 +0000
committerBen.Lippmeier@anu.edu.au <unknown>2009-05-18 01:44:44 +0000
commitf9288086f935c97812b2d80defcff38baf7b6a6c (patch)
treef5363edcc32f9414c6763c060f6be330d46f0cc6 /compiler/utils/GraphColor.hs
parentde29a9f02449359b70402f763ac7590673774124 (diff)
downloadhaskell-f9288086f935c97812b2d80defcff38baf7b6a6c.tar.gz
Split Reg into vreg/hreg and add register pairs
* The old Reg type is now split into VirtualReg and RealReg. * For the graph coloring allocator, the type of the register graph is now (Graph VirtualReg RegClass RealReg), which shows that it colors in nodes representing virtual regs with colors representing real regs. (as was intended) * RealReg contains two contructors, RealRegSingle and RealRegPair, where RealRegPair is used to represent a SPARC double reg constructed from two single precision FP regs. * On SPARC we can now allocate double regs into an arbitrary register pair, instead of reserving some reg ranges to only hold float/double values.
Diffstat (limited to 'compiler/utils/GraphColor.hs')
-rw-r--r--compiler/utils/GraphColor.hs21
1 files changed, 13 insertions, 8 deletions
diff --git a/compiler/utils/GraphColor.hs b/compiler/utils/GraphColor.hs
index 8e7989dc8c..8dc41216e7 100644
--- a/compiler/utils/GraphColor.hs
+++ b/compiler/utils/GraphColor.hs
@@ -98,12 +98,13 @@ colorGraph iterative spinCount colors triv spill graph0
-- with the provided triv function.
--
in if not $ null ksNoTriv
- then pprPanic "colorGraph: trivially colorable nodes didn't color!" empty
-{- ( empty
+ then pprPanic "colorGraph: trivially colorable nodes didn't color!" -- empty
+ ( empty
$$ text "ksTriv = " <> ppr ksTriv
$$ text "ksNoTriv = " <> ppr ksNoTriv
+ $$ text "colors = " <> ppr colors
$$ empty
- $$ dotGraph (\x -> text "white") triv graph1) -}
+ $$ dotGraph (\_ -> text "white") triv graph_triv)
else ( graph_prob
, mkUniqSet ksNoColor -- the nodes that didn't color (spills)
@@ -131,7 +132,7 @@ colorGraph iterative spinCount colors triv spill graph0
colorScan
:: ( Uniquable k, Uniquable cls, Uniquable color
, Ord k, Eq cls
- , Outputable k, Outputable color)
+ , Outputable k, Outputable cls)
=> Bool -- ^ whether to do iterative coalescing
-> 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.
@@ -224,7 +225,8 @@ colorScan_spill iterative triv spill graph
-- | Try to assign a color to all these nodes.
assignColors
- :: ( Uniquable k, Uniquable cls, Uniquable color, Eq color )
+ :: ( Uniquable k, Uniquable cls, Uniquable color
+ , Eq color, Outputable cls)
=> UniqFM (UniqSet color) -- ^ map of (node class -> set of colors available for this class).
-> Graph k cls color -- ^ the graph
-> [k] -- ^ nodes to assign a color to.
@@ -261,7 +263,8 @@ assignColors colors graph ks
-- returns Nothing if no color can be assigned to this node.
--
selectColor
- :: ( Uniquable k, Uniquable cls, Uniquable color, Eq color)
+ :: ( Uniquable k, Uniquable cls, Uniquable color
+ , Eq color, Outputable cls)
=> UniqFM (UniqSet color) -- ^ map of (node class -> set of colors available for this class).
-> Graph k cls color -- ^ the graph
-> k -- ^ key of the node to select a color for.
@@ -272,8 +275,10 @@ selectColor colors graph u
Just node = lookupNode graph u
-- lookup the available colors for the class of this node.
- Just colors_avail
- = lookupUFM colors (nodeClass node)
+ colors_avail
+ = case lookupUFM colors (nodeClass node) of
+ Nothing -> pprPanic "selectColor: no colors available for class " (ppr (nodeClass node))
+ Just cs -> cs
-- find colors we can't use because they're already being used
-- by a node that conflicts with this one.