diff options
author | Ben Gamari <ben@smart-cactus.org> | 2021-09-24 15:53:03 -0400 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2021-09-29 09:44:40 -0400 |
commit | 1f2ba67a07c1f94c0232952eb3af184a0962e881 (patch) | |
tree | 949c8217d034bead410b59686128550cf1f6513f | |
parent | df8c5961bcb45902a64b40ba7b578d7950fd1b30 (diff) | |
download | haskell-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.hs | 4 | ||||
-rw-r--r-- | compiler/GHC/Types/Name/Env.hs | 13 |
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 |