diff options
author | Simon Marlow <simonmar@microsoft.com> | 2007-09-12 11:41:10 +0000 |
---|---|---|
committer | Simon Marlow <simonmar@microsoft.com> | 2007-09-12 11:41:10 +0000 |
commit | b01110d1352de5d972d8fb63f28c244d2c1ff99b (patch) | |
tree | 504e83cf75e314bdf40035fc092d5676c36b7ad1 /compiler/nativeGen/GraphBase.hs | |
parent | 569348e87434f2a8d9e18dccac8b4a563b4eb363 (diff) | |
download | haskell-b01110d1352de5d972d8fb63f28c244d2c1ff99b.tar.gz |
move generic graph-colouring code into util
It is needed by cmm/StackColor, and hence is needed even when there is no
native code generator.
Diffstat (limited to 'compiler/nativeGen/GraphBase.hs')
-rw-r--r-- | compiler/nativeGen/GraphBase.hs | 111 |
1 files changed, 0 insertions, 111 deletions
diff --git a/compiler/nativeGen/GraphBase.hs b/compiler/nativeGen/GraphBase.hs deleted file mode 100644 index 04eda96120..0000000000 --- a/compiler/nativeGen/GraphBase.hs +++ /dev/null @@ -1,111 +0,0 @@ - --- | Types for the general graph colorer. - -module GraphBase ( - Triv, - Graph (..), - initGraph, - graphMapModify, - - Node (..), newNode, -) - - -where - -import UniqSet -import UniqFM - - --- | A fn to check if a node is trivially colorable --- For graphs who's color classes are disjoint then a node is 'trivially colorable' --- when it has less neighbors and exclusions than available colors for that node. --- --- For graph's who's color classes overlap, ie some colors alias other colors, then --- this can be a bit more tricky. There is a general way to calculate this, but --- it's likely be too slow for use in the code. The coloring algorithm takes --- a canned function which can be optimised by the user to be specific to the --- specific graph being colored. --- --- for details, see "A Generalised Algorithm for Graph-Coloring Register Allocation" --- Smith, Ramsey, Holloway - PLDI 2004. --- -type Triv k cls color - = cls -- ^ the class of the node we're trying to color. - -> UniqSet k -- ^ the node's neighbors. - -> UniqSet color -- ^ the node's exclusions. - -> Bool - - --- | The Interference graph. --- There used to be more fields, but they were turfed out in a previous revision. --- maybe we'll want more later.. --- -data Graph k cls color - = Graph { - -- | All active nodes in the graph. - graphMap :: UniqFM (Node k cls color) } - - --- | An empty graph. -initGraph :: Graph k cls color -initGraph - = Graph - { graphMap = emptyUFM } - - --- | Modify the finite map holding the nodes in the graph. -graphMapModify - :: (UniqFM (Node k cls color) -> UniqFM (Node k cls color)) - -> Graph k cls color -> Graph k cls color - -graphMapModify f graph - = graph { graphMap = f (graphMap graph) } - - - --- | Graph nodes. --- Represents a thing that can conflict with another thing. --- For the register allocater the nodes represent registers. --- -data Node k cls color - = Node { - -- | A unique identifier for this node. - nodeId :: k - - -- | The class of this node, - -- determines the set of colors that can be used. - , nodeClass :: cls - - -- | The color of this node, if any. - , nodeColor :: Maybe color - - -- | Neighbors which must be colored differently to this node. - , nodeConflicts :: UniqSet k - - -- | Colors that cannot be used by this node. - , nodeExclusions :: UniqSet color - - -- | Colors that this node would prefer to be, in decending order. - , nodePreference :: [color] - - -- | Neighbors that this node would like to be colored the same as. - , nodeCoalesce :: UniqSet k } - - --- | An empty node. -newNode :: k -> cls -> Node k cls color -newNode k cls - = Node - { nodeId = k - , nodeClass = cls - , nodeColor = Nothing - , nodeConflicts = emptyUniqSet - , nodeExclusions = emptyUniqSet - , nodePreference = [] - , nodeCoalesce = emptyUniqSet } - - - - - |