summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2021-09-24 15:53:03 -0400
committerMarge Bot <ben+marge-bot@smart-cactus.org>2021-09-29 09:44:40 -0400
commit1f2ba67a07c1f94c0232952eb3af184a0962e881 (patch)
tree949c8217d034bead410b59686128550cf1f6513f
parentdf8c5961bcb45902a64b40ba7b578d7950fd1b30 (diff)
downloadhaskell-1f2ba67a07c1f94c0232952eb3af184a0962e881.tar.gz
compiler: Make nubAvails deterministic
Surprisingly this previously didn't appear to introduce any visible non-determinism but it seems worth avoiding non-determinism here.
-rw-r--r--compiler/GHC/Types/Avail.hs4
-rw-r--r--compiler/GHC/Types/Name/Env.hs13
2 files changed, 12 insertions, 5 deletions
diff --git a/compiler/GHC/Types/Avail.hs b/compiler/GHC/Types/Avail.hs
index 93c3975ba3..487802687f 100644
--- a/compiler/GHC/Types/Avail.hs
+++ b/compiler/GHC/Types/Avail.hs
@@ -349,9 +349,9 @@ filterAvail keep ie rest =
-- will give Ix(Ix,index,range) and Ix(index)
-- We want to combine these; addAvail does that
nubAvails :: [AvailInfo] -> [AvailInfo]
-nubAvails avails = nameEnvElts (foldl' add emptyNameEnv avails)
+nubAvails avails = eltsDNameEnv (foldl' add emptyDNameEnv avails)
where
- add env avail = extendNameEnv_C plusAvail env (availName avail) avail
+ add env avail = extendDNameEnv_C plusAvail env (availName avail) avail
-- -----------------------------------------------------------------------------
-- Printing
diff --git a/compiler/GHC/Types/Name/Env.hs b/compiler/GHC/Types/Name/Env.hs
index b71aa122ee..6bab3f7c16 100644
--- a/compiler/GHC/Types/Name/Env.hs
+++ b/compiler/GHC/Types/Name/Env.hs
@@ -16,7 +16,7 @@ module GHC.Types.Name.Env (
-- ** Manipulating these environments
mkNameEnv, mkNameEnvWith,
emptyNameEnv, isEmptyNameEnv,
- unitNameEnv, nameEnvElts,
+ unitNameEnv, nonDetNameEnvElts,
extendNameEnv_C, extendNameEnv_Acc, extendNameEnv,
extendNameEnvList, extendNameEnvList_C,
filterNameEnv, anyNameEnv,
@@ -31,6 +31,7 @@ module GHC.Types.Name.Env (
delFromDNameEnv, filterDNameEnv,
mapDNameEnv,
adjustDNameEnv, alterDNameEnv, extendDNameEnv,
+ eltsDNameEnv, extendDNameEnv_C,
-- ** Dependency analysis
depAnal
) where
@@ -97,7 +98,7 @@ emptyNameEnv :: NameEnv a
isEmptyNameEnv :: NameEnv a -> Bool
mkNameEnv :: [(Name,a)] -> NameEnv a
mkNameEnvWith :: (a -> Name) -> [a] -> NameEnv a
-nameEnvElts :: NameEnv a -> [a]
+nonDetNameEnvElts :: NameEnv a -> [a]
alterNameEnv :: (Maybe a-> Maybe a) -> NameEnv a -> Name -> NameEnv a
extendNameEnv_C :: (a->a->a) -> NameEnv a -> Name -> a -> NameEnv a
extendNameEnv_Acc :: (a->b->b) -> (a->b) -> NameEnv b -> Name -> a -> NameEnv b
@@ -119,7 +120,7 @@ anyNameEnv :: (elt -> Bool) -> NameEnv elt -> Bool
mapNameEnv :: (elt1 -> elt2) -> NameEnv elt1 -> NameEnv elt2
disjointNameEnv :: NameEnv a -> NameEnv a -> Bool
-nameEnvElts x = nonDetEltsUFM x
+nonDetNameEnvElts x = nonDetEltsUFM x
emptyNameEnv = emptyUFM
isEmptyNameEnv = isNullUFM
unitNameEnv x y = unitUFM x y
@@ -176,3 +177,9 @@ alterDNameEnv = alterUDFM
extendDNameEnv :: DNameEnv a -> Name -> a -> DNameEnv a
extendDNameEnv = addToUDFM
+
+extendDNameEnv_C :: (a -> a -> a) -> DNameEnv a -> Name -> a -> DNameEnv a
+extendDNameEnv_C = addToUDFM_C
+
+eltsDNameEnv :: DNameEnv a -> [a]
+eltsDNameEnv = eltsUDFM