diff options
Diffstat (limited to 'compiler/utils')
-rw-r--r-- | compiler/utils/GraphOps.hs | 30 | ||||
-rw-r--r-- | compiler/utils/UniqSet.hs | 4 |
2 files changed, 20 insertions, 14 deletions
diff --git a/compiler/utils/GraphOps.hs b/compiler/utils/GraphOps.hs index ba0db0f9f9..8b194adba5 100644 --- a/compiler/utils/GraphOps.hs +++ b/compiler/utils/GraphOps.hs @@ -58,18 +58,24 @@ addNode :: Uniquable k addNode k node graph = let -- add back conflict edges from other nodes to this one - map_conflict - = foldUniqSet - (adjustUFM_C (\n -> n { nodeConflicts = addOneToUniqSet (nodeConflicts n) k})) - (graphMap graph) - (nodeConflicts node) + map_conflict = + nonDetFoldUFM + -- It's OK to use nonDetFoldUFM here because the + -- operation is commutative + (adjustUFM_C (\n -> n { nodeConflicts = + addOneToUniqSet (nodeConflicts n) k})) + (graphMap graph) + (nodeConflicts node) -- add back coalesce edges from other nodes to this one - map_coalesce - = foldUniqSet - (adjustUFM_C (\n -> n { nodeCoalesce = addOneToUniqSet (nodeCoalesce n) k})) - map_conflict - (nodeCoalesce node) + map_coalesce = + nonDetFoldUFM + -- It's OK to use nonDetFoldUFM here because the + -- operation is commutative + (adjustUFM_C (\n -> n { nodeCoalesce = + addOneToUniqSet (nodeCoalesce n) k})) + map_conflict + (nodeCoalesce node) in graph { graphMap = addToUFM map_coalesce k node} @@ -462,7 +468,9 @@ freezeNode k else node -- panic "GraphOps.freezeNode: edge to freeze wasn't in the coalesce set" -- If the edge isn't actually in the coelesce set then just ignore it. - fm2 = foldUniqSet (adjustUFM_C (freezeEdge k)) fm1 + fm2 = nonDetFoldUFM (adjustUFM_C (freezeEdge k)) fm1 + -- It's OK to use nonDetFoldUFM here because the operation + -- is commutative $ nodeCoalesce node in fm2 diff --git a/compiler/utils/UniqSet.hs b/compiler/utils/UniqSet.hs index a316f53370..925997f45a 100644 --- a/compiler/utils/UniqSet.hs +++ b/compiler/utils/UniqSet.hs @@ -22,7 +22,7 @@ module UniqSet ( unionUniqSets, unionManyUniqSets, minusUniqSet, intersectUniqSets, - foldUniqSet, uniqSetAny, uniqSetAll, + uniqSetAny, uniqSetAll, elementOfUniqSet, elemUniqSet_Directly, filterUniqSet, @@ -61,7 +61,6 @@ unionManyUniqSets :: [UniqSet a] -> UniqSet a minusUniqSet :: UniqSet a -> UniqSet a -> UniqSet a intersectUniqSets :: UniqSet a -> UniqSet a -> UniqSet a -foldUniqSet :: (a -> b -> b) -> b -> UniqSet a -> b elementOfUniqSet :: Uniquable a => a -> UniqSet a -> Bool elemUniqSet_Directly :: Unique -> UniqSet a -> Bool filterUniqSet :: (a -> Bool) -> UniqSet a -> UniqSet a @@ -109,7 +108,6 @@ unionManyUniqSets sets = foldr1 unionUniqSets sets minusUniqSet = minusUFM intersectUniqSets = intersectUFM -foldUniqSet = foldUFM elementOfUniqSet = elemUFM elemUniqSet_Directly = elemUFM_Directly filterUniqSet = filterUFM |