summaryrefslogtreecommitdiff
path: root/compiler/GHC/Stg
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2021-11-15 23:22:06 -0500
committerMarge Bot <ben+marge-bot@smart-cactus.org>2021-11-17 05:10:27 -0500
commit083a7583d70c190b090fedcf9f955eff65d4baeb (patch)
tree8706cc9ee591bf2a05c23efcaa7251a0489e4c24 /compiler/GHC/Stg
parent3e94b5a7ebddf156f00599c6bd2e9ba1af437a6c (diff)
downloadhaskell-083a7583d70c190b090fedcf9f955eff65d4baeb.tar.gz
Increase type sharing
Fixes #20541 by making mkTyConApp do more sharing of types. In particular, replace * BoxedRep Lifted ==> LiftedRep * BoxedRep Unlifted ==> UnliftedRep * TupleRep '[] ==> ZeroBitRep * TYPE ZeroBitRep ==> ZeroBitType In each case, the thing on the right is a type synonym for the thing on the left, declared in ghc-prim:GHC.Types. See Note [Using synonyms to compress types] in GHC.Core.Type. The synonyms for ZeroBitRep and ZeroBitType are new, but absolutely in the same spirit as the other ones. (These synonyms are mainly for internal use, though the programmer can use them too.) I also renamed GHC.Core.Ty.Rep.isVoidTy to isZeroBitTy, to be compatible with the "zero-bit" nomenclature above. See discussion on !6806. There is a tricky wrinkle: see GHC.Core.Types Note [Care using synonyms to compress types] Compiler allocation decreases by up to 0.8%.
Diffstat (limited to 'compiler/GHC/Stg')
-rw-r--r--compiler/GHC/Stg/Lint.hs2
-rw-r--r--compiler/GHC/Stg/Unarise.hs12
2 files changed, 7 insertions, 7 deletions
diff --git a/compiler/GHC/Stg/Lint.hs b/compiler/GHC/Stg/Lint.hs
index 404008ac0e..ecca8a78e2 100644
--- a/compiler/GHC/Stg/Lint.hs
+++ b/compiler/GHC/Stg/Lint.hs
@@ -355,7 +355,7 @@ checkPostUnariseId id =
is_sum, is_tuple, is_void :: Maybe String
is_sum = guard (isUnboxedSumType id_ty) >> return "unboxed sum"
is_tuple = guard (isUnboxedTupleType id_ty) >> return "unboxed tuple"
- is_void = guard (isVoidTy id_ty) >> return "void"
+ is_void = guard (isZeroBitTy id_ty) >> return "void"
in
is_sum <|> is_tuple <|> is_void
diff --git a/compiler/GHC/Stg/Unarise.hs b/compiler/GHC/Stg/Unarise.hs
index b3ae7957d9..15635e754a 100644
--- a/compiler/GHC/Stg/Unarise.hs
+++ b/compiler/GHC/Stg/Unarise.hs
@@ -557,7 +557,7 @@ mapTupleIdBinders
-> UnariseEnv
-> UnariseEnv
mapTupleIdBinders ids args0 rho0
- = assert (not (any (isVoidTy . stgArgType) args0)) $
+ = assert (not (any (isZeroBitTy . stgArgType) args0)) $
let
ids_unarised :: [(Id, [PrimRep])]
ids_unarised = map (\id -> (id, typePrimRep (idType id))) ids
@@ -591,7 +591,7 @@ mapSumIdBinders
-> UnariseEnv
mapSumIdBinders [id] args rho0
- = assert (not (any (isVoidTy . stgArgType) args)) $
+ = assert (not (any (isZeroBitTy . stgArgType) args)) $
let
arg_slots = map primRepSlot $ concatMap (typePrimRep . stgArgType) args
id_slots = map primRepSlot $ typePrimRep (idType id)
@@ -777,15 +777,15 @@ unariseConArg rho (StgVarArg x) =
Just (UnaryVal arg) -> [arg]
Just (MultiVal as) -> as -- 'as' can be empty
Nothing
- | isVoidTy (idType x) -> [] -- e.g. C realWorld#
- -- Here realWorld# is not in the envt, but
- -- is a void, and so should be eliminated
+ | isZeroBitTy (idType x) -> [] -- e.g. C realWorld#
+ -- Here realWorld# is not in the envt, but
+ -- is a void, and so should be eliminated
| otherwise -> [StgVarArg x]
unariseConArg _ arg@(StgLitArg lit)
| Just as <- unariseRubbish_maybe lit
= as
| otherwise
- = assert (not (isVoidTy (literalType lit))) -- We have no non-rubbish void literals
+ = assert (not (isZeroBitTy (literalType lit))) -- We have no non-rubbish void literals
[arg]
unariseConArgs :: UnariseEnv -> [InStgArg] -> [OutStgArg]