summaryrefslogtreecommitdiff
path: root/compiler/GHC/Builtin
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/Builtin
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/Builtin')
-rw-r--r--compiler/GHC/Builtin/Names.hs38
-rw-r--r--compiler/GHC/Builtin/Types.hs223
-rw-r--r--compiler/GHC/Builtin/Types.hs-boot15
-rw-r--r--compiler/GHC/Builtin/Types/Prim.hs22
4 files changed, 186 insertions, 112 deletions
diff --git a/compiler/GHC/Builtin/Names.hs b/compiler/GHC/Builtin/Names.hs
index 5b6f032bc5..1c689629f1 100644
--- a/compiler/GHC/Builtin/Names.hs
+++ b/compiler/GHC/Builtin/Names.hs
@@ -1877,7 +1877,8 @@ eitherTyConKey = mkPreludeTyConUnique 84
liftedTypeKindTyConKey, unliftedTypeKindTyConKey,
tYPETyConKey, liftedRepTyConKey, unliftedRepTyConKey,
constraintKindTyConKey, levityTyConKey, runtimeRepTyConKey,
- vecCountTyConKey, vecElemTyConKey :: Unique
+ vecCountTyConKey, vecElemTyConKey,
+ zeroBitRepTyConKey, zeroBitTypeTyConKey :: Unique
liftedTypeKindTyConKey = mkPreludeTyConUnique 87
unliftedTypeKindTyConKey = mkPreludeTyConUnique 88
tYPETyConKey = mkPreludeTyConUnique 89
@@ -1888,11 +1889,22 @@ vecCountTyConKey = mkPreludeTyConUnique 96
vecElemTyConKey = mkPreludeTyConUnique 97
liftedRepTyConKey = mkPreludeTyConUnique 98
unliftedRepTyConKey = mkPreludeTyConUnique 99
+zeroBitRepTyConKey = mkPreludeTyConUnique 100
+zeroBitTypeTyConKey = mkPreludeTyConUnique 101
pluginTyConKey, frontendPluginTyConKey :: Unique
pluginTyConKey = mkPreludeTyConUnique 102
frontendPluginTyConKey = mkPreludeTyConUnique 103
+trTyConTyConKey, trModuleTyConKey, trNameTyConKey,
+ kindRepTyConKey, typeLitSortTyConKey :: Unique
+trTyConTyConKey = mkPreludeTyConUnique 104
+trModuleTyConKey = mkPreludeTyConUnique 105
+trNameTyConKey = mkPreludeTyConUnique 106
+kindRepTyConKey = mkPreludeTyConUnique 107
+typeLitSortTyConKey = mkPreludeTyConUnique 108
+
+
-- Generics (Unique keys)
v1TyConKey, u1TyConKey, par1TyConKey, rec1TyConKey,
k1TyConKey, m1TyConKey, sumTyConKey, prodTyConKey,
@@ -2092,21 +2104,14 @@ fingerprintDataConKey = mkPreludeDataConUnique 35
srcLocDataConKey :: Unique
srcLocDataConKey = mkPreludeDataConUnique 37
-trTyConTyConKey, trTyConDataConKey,
- trModuleTyConKey, trModuleDataConKey,
- trNameTyConKey, trNameSDataConKey, trNameDDataConKey,
- trGhcPrimModuleKey, kindRepTyConKey,
- typeLitSortTyConKey :: Unique
-trTyConTyConKey = mkPreludeDataConUnique 40
+trTyConDataConKey, trModuleDataConKey,
+ trNameSDataConKey, trNameDDataConKey,
+ trGhcPrimModuleKey :: Unique
trTyConDataConKey = mkPreludeDataConUnique 41
-trModuleTyConKey = mkPreludeDataConUnique 42
trModuleDataConKey = mkPreludeDataConUnique 43
-trNameTyConKey = mkPreludeDataConUnique 44
trNameSDataConKey = mkPreludeDataConUnique 45
trNameDDataConKey = mkPreludeDataConUnique 46
trGhcPrimModuleKey = mkPreludeDataConUnique 47
-kindRepTyConKey = mkPreludeDataConUnique 48
-typeLitSortTyConKey = mkPreludeDataConUnique 49
typeErrorTextDataConKey,
typeErrorAppendDataConKey,
@@ -2143,13 +2148,19 @@ metaDataDataConKey = mkPreludeDataConUnique 68
metaConsDataConKey = mkPreludeDataConUnique 69
metaSelDataConKey = mkPreludeDataConUnique 70
-vecRepDataConKey, tupleRepDataConKey, sumRepDataConKey,
- boxedRepDataConKey :: Unique
+vecRepDataConKey, sumRepDataConKey,
+ tupleRepDataConKey, boxedRepDataConKey :: Unique
vecRepDataConKey = mkPreludeDataConUnique 71
tupleRepDataConKey = mkPreludeDataConUnique 72
sumRepDataConKey = mkPreludeDataConUnique 73
boxedRepDataConKey = mkPreludeDataConUnique 74
+boxedRepDataConTyConKey, tupleRepDataConTyConKey :: Unique
+-- A promoted data constructors (i.e. a TyCon) has
+-- the same key as the data constructor itself
+boxedRepDataConTyConKey = boxedRepDataConKey
+tupleRepDataConTyConKey = tupleRepDataConKey
+
-- See Note [Wiring in RuntimeRep] in GHC.Builtin.Types
-- Includes all nullary-data-constructor reps. Does not
-- include BoxedRep, VecRep, SumRep, TupleRep.
@@ -2208,6 +2219,7 @@ integerIPDataConKey = mkPreludeDataConUnique 122
naturalNSDataConKey = mkPreludeDataConUnique 123
naturalNBDataConKey = mkPreludeDataConUnique 124
+
---------------- Template Haskell -------------------
-- GHC.Builtin.Names.TH: USES DataUniques 200-250
-----------------------------------------------------
diff --git a/compiler/GHC/Builtin/Types.hs b/compiler/GHC/Builtin/Types.hs
index 1c587810ba..42cf6c3a4b 100644
--- a/compiler/GHC/Builtin/Types.hs
+++ b/compiler/GHC/Builtin/Types.hs
@@ -101,7 +101,7 @@ module GHC.Builtin.Types (
isLiftedTypeKindTyConName,
typeToTypeKind,
liftedRepTyCon, unliftedRepTyCon,
- constraintKind, liftedTypeKind, unliftedTypeKind,
+ constraintKind, liftedTypeKind, unliftedTypeKind, zeroBitTypeKind,
constraintKindTyCon, liftedTypeKindTyCon, unliftedTypeKindTyCon,
constraintKindTyConName, liftedTypeKindTyConName, unliftedTypeKindTyConName,
liftedRepTyConName, unliftedRepTyConName,
@@ -115,7 +115,7 @@ module GHC.Builtin.Types (
runtimeRepTyCon, levityTyCon, vecCountTyCon, vecElemTyCon,
boxedRepDataConTyCon,
- runtimeRepTy, levityTy, liftedRepTy, unliftedRepTy,
+ runtimeRepTy, levityTy, liftedRepTy, unliftedRepTy, zeroBitRepTy,
vecRepDataConTyCon, tupleRepDataConTyCon, sumRepDataConTyCon,
@@ -207,18 +207,6 @@ alpha_ty :: [Type]
alpha_ty = [alphaTy]
{-
-Note [Wiring in RuntimeRep]
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-The RuntimeRep type (and friends) in GHC.Types has a bunch of constructors,
-making it a pain to wire in. To ease the pain somewhat, we use lists of
-the different bits, like Uniques, Names, DataCons. These lists must be
-kept in sync with each other. The rule is this: use the order as declared
-in GHC.Types. All places where such lists exist should contain a reference
-to this Note, so a search for this Note's name should find all the lists.
-
-See also Note [Getting from RuntimeRep to PrimRep] in GHC.Types.RepType.
-
-
Note [Wired-in Types and Type Constructors]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -324,6 +312,8 @@ wiredInTyCons = [ -- Units are not treated like other tuples, because they
, integerTyCon
, liftedRepTyCon
, unliftedRepTyCon
+ , zeroBitRepTyCon
+ , zeroBitTypeTyCon
]
mkWiredInTyConName :: BuiltInSyntax -> Module -> FastString -> Unique -> TyCon -> Name
@@ -540,13 +530,15 @@ typeSymbolKindConName = mkWiredInTyConName UserSyntax gHC_TYPES (fsLit "Symbol")
constraintKindTyConName :: Name
constraintKindTyConName = mkWiredInTyConName UserSyntax gHC_TYPES (fsLit "Constraint") constraintKindTyConKey constraintKindTyCon
-liftedTypeKindTyConName, unliftedTypeKindTyConName :: Name
-liftedTypeKindTyConName = mkWiredInTyConName UserSyntax gHC_TYPES (fsLit "Type") liftedTypeKindTyConKey liftedTypeKindTyCon
+liftedTypeKindTyConName, unliftedTypeKindTyConName, zeroBitTypeTyConName :: Name
+liftedTypeKindTyConName = mkWiredInTyConName UserSyntax gHC_TYPES (fsLit "Type") liftedTypeKindTyConKey liftedTypeKindTyCon
unliftedTypeKindTyConName = mkWiredInTyConName UserSyntax gHC_TYPES (fsLit "UnliftedType") unliftedTypeKindTyConKey unliftedTypeKindTyCon
+zeroBitTypeTyConName = mkWiredInTyConName UserSyntax gHC_TYPES (fsLit "ZeroBitType") zeroBitTypeTyConKey zeroBitTypeTyCon
-liftedRepTyConName, unliftedRepTyConName :: Name
-liftedRepTyConName = mkWiredInTyConName UserSyntax gHC_TYPES (fsLit "LiftedRep") liftedRepTyConKey liftedRepTyCon
+liftedRepTyConName, unliftedRepTyConName, zeroBitRepTyConName :: Name
+liftedRepTyConName = mkWiredInTyConName UserSyntax gHC_TYPES (fsLit "LiftedRep") liftedRepTyConKey liftedRepTyCon
unliftedRepTyConName = mkWiredInTyConName UserSyntax gHC_TYPES (fsLit "UnliftedRep") unliftedRepTyConKey unliftedRepTyCon
+zeroBitRepTyConName = mkWiredInTyConName UserSyntax gHC_TYPES (fsLit "ZeroBitRep") zeroBitRepTyConKey zeroBitRepTyCon
multiplicityTyConName :: Name
multiplicityTyConName = mkWiredInTyConName UserSyntax gHC_TYPES (fsLit "Multiplicity")
@@ -757,10 +749,7 @@ constraintKindTyCon :: TyCon
-- 'TyCon.isConstraintKindCon' assumes that this is an AlgTyCon!
constraintKindTyCon = pcTyCon constraintKindTyConName Nothing [] []
--- See Note [Prefer Type over TYPE 'LiftedRep] in GHC.Core.TyCo.Rep.
-liftedTypeKind, unliftedTypeKind, typeToTypeKind, constraintKind :: Kind
-liftedTypeKind = mkTyConTy liftedTypeKindTyCon
-unliftedTypeKind = mkTyConTy unliftedTypeKindTyCon
+typeToTypeKind, constraintKind :: Kind
typeToTypeKind = liftedTypeKind `mkVisFunTyMany` liftedTypeKind
constraintKind = mkTyConTy constraintKindTyCon
@@ -1108,7 +1097,7 @@ cTupleArr = listArray (0,mAX_CTUPLE_SIZE) [mk_ctuple i | i <- [0..mAX_CTUPLE_SIZ
-- [IntRep, LiftedRep])@
unboxedTupleSumKind :: TyCon -> [Type] -> Kind
unboxedTupleSumKind tc rr_tys
- = tYPE (mkTyConApp tc [mkPromotedListTy runtimeRepTy rr_tys])
+ = mkTYPEapp (mkTyConApp tc [mkPromotedListTy runtimeRepTy rr_tys])
-- | Specialization of 'unboxedTupleSumKind' for tuples
unboxedTupleKind :: [Type] -> Kind
@@ -1146,7 +1135,7 @@ mk_tuple Unboxed arity = (tycon, tuple_con)
-- See Note [Unboxed tuple RuntimeRep vars] in GHC.Core.TyCon
-- Kind: forall (k1:RuntimeRep) (k2:RuntimeRep). TYPE k1 -> TYPE k2 -> TYPE (TupleRep [k1, k2])
tc_binders = mkTemplateTyConBinders (replicate arity runtimeRepTy)
- (\ks -> map tYPE ks)
+ (\ks -> map mkTYPEapp ks)
tc_res_kind = unboxedTupleKind rr_tys
@@ -1224,13 +1213,13 @@ pairTyCon :: TyCon
pairTyCon = tupleTyCon Boxed 2
unboxedUnitTy :: Type
-unboxedUnitTy = mkTyConApp unboxedUnitTyCon []
+unboxedUnitTy = mkTyConTy unboxedUnitTyCon
unboxedUnitTyCon :: TyCon
unboxedUnitTyCon = tupleTyCon Unboxed 0
unboxedUnitDataCon :: DataCon
-unboxedUnitDataCon = tupleDataCon Unboxed 0
+unboxedUnitDataCon = tupleDataCon Unboxed 0
{- *********************************************************************
@@ -1308,7 +1297,7 @@ mk_sum arity = (tycon, sum_cons)
UnboxedSumTyCon
tc_binders = mkTemplateTyConBinders (replicate arity runtimeRepTy)
- (\ks -> map tYPE ks)
+ (\ks -> map mkTYPEapp ks)
tyvars = binderVars tc_binders
@@ -1472,67 +1461,163 @@ unrestrictedFunTyCon = buildSynTyCon unrestrictedFunTyConName [] arrowKind [] un
binders = [ Bndr runtimeRep1TyVar (NamedTCB Inferred)
, Bndr runtimeRep2TyVar (NamedTCB Inferred)
]
- ++ mkTemplateAnonTyConBinders [ tYPE runtimeRep1Ty
- , tYPE runtimeRep2Ty
+ ++ mkTemplateAnonTyConBinders [ mkTYPEapp runtimeRep1Ty
+ , mkTYPEapp runtimeRep2Ty
]
unrestrictedFunTyConName :: Name
-unrestrictedFunTyConName = mkWiredInTyConName BuiltInSyntax gHC_TYPES (fsLit "->") unrestrictedFunTyConKey unrestrictedFunTyCon
+unrestrictedFunTyConName = mkWiredInTyConName BuiltInSyntax gHC_TYPES (fsLit "->")
+ unrestrictedFunTyConKey unrestrictedFunTyCon
+
{- *********************************************************************
* *
- Kinds and RuntimeRep
+ Type synonyms (all declared in ghc-prim:GHC.Types)
+
+ type Type = TYPE LiftedRep -- liftedTypeKind
+ type UnliftedType = TYPE UnliftedRep -- unliftedTypeKind
+ type LiftedRep = BoxedRep Lifted -- liftedRepTy
+ type UnliftedRep = BoxedRep Unlifted -- unliftedRepTy
+
* *
********************************************************************* -}
--- For information about the usage of the following type,
--- see Note [TYPE and RuntimeRep] in module GHC.Builtin.Types.Prim
-runtimeRepTy, levityTy :: Type
-runtimeRepTy = mkTyConTy runtimeRepTyCon
-levityTy = mkTyConTy levityTyCon
+-- For these synonyms, see
+-- Note [TYPE and RuntimeRep] in GHC.Builtin.Types.Prim, and
+-- Note [Using synonyms to compress types] in GHC.Core.Type
--- Type synonyms; see Note [TYPE and RuntimeRep] in GHC.Builtin.Types.Prim
--- and Note [Prefer Type over TYPE 'LiftedRep] in GHC.Core.TyCo.Rep.
---
+----------------------
-- @type Type = TYPE ('BoxedRep 'Lifted)@
liftedTypeKindTyCon :: TyCon
-liftedTypeKindTyCon =
- buildSynTyCon liftedTypeKindTyConName [] liftedTypeKind [] rhs
- where rhs = TyCoRep.TyConApp tYPETyCon [mkTyConApp liftedRepTyCon []]
+liftedTypeKindTyCon
+ = buildSynTyCon liftedTypeKindTyConName [] liftedTypeKind [] rhs
+ where
+ rhs = TyCoRep.TyConApp tYPETyCon [liftedRepTy]
+liftedTypeKind :: Type
+liftedTypeKind = mkTyConTy liftedTypeKindTyCon
+
+----------------------
-- | @type UnliftedType = TYPE ('BoxedRep 'Unlifted)@
unliftedTypeKindTyCon :: TyCon
-unliftedTypeKindTyCon =
- buildSynTyCon unliftedTypeKindTyConName [] liftedTypeKind [] rhs
- where rhs = TyCoRep.TyConApp tYPETyCon [mkTyConApp unliftedRepTyCon []]
+unliftedTypeKindTyCon
+ = buildSynTyCon unliftedTypeKindTyConName [] liftedTypeKind [] rhs
+ where
+ rhs = TyCoRep.TyConApp tYPETyCon [unliftedRepTy]
+unliftedTypeKind :: Type
+unliftedTypeKind = mkTyConTy unliftedTypeKindTyCon
+
+----------------------
+-- @type ZeroBitType = TYPE ZeroBitRep
+zeroBitTypeTyCon :: TyCon
+zeroBitTypeTyCon
+ = buildSynTyCon zeroBitTypeTyConName [] liftedTypeKind [] rhs
+ where
+ rhs = TyCoRep.TyConApp tYPETyCon [zeroBitRepTy]
+
+zeroBitTypeKind :: Type
+zeroBitTypeKind = mkTyConTy zeroBitTypeTyCon
+
+----------------------
-- | @type LiftedRep = 'BoxedRep 'Lifted@
liftedRepTyCon :: TyCon
-liftedRepTyCon = buildSynTyCon
- liftedRepTyConName [] runtimeRepTy [] liftedRepTy
+liftedRepTyCon
+ = buildSynTyCon liftedRepTyConName [] runtimeRepTy [] rhs
+ where
+ rhs = TyCoRep.TyConApp boxedRepDataConTyCon [liftedDataConTy]
+liftedRepTy :: Type
+liftedRepTy = mkTyConTy liftedRepTyCon
+
+----------------------
-- | @type UnliftedRep = 'BoxedRep 'Unlifted@
unliftedRepTyCon :: TyCon
-unliftedRepTyCon = buildSynTyCon
- unliftedRepTyConName [] runtimeRepTy [] unliftedRepTy
+unliftedRepTyCon
+ = buildSynTyCon unliftedRepTyConName [] runtimeRepTy [] rhs
+ where
+ rhs = TyCoRep.TyConApp boxedRepDataConTyCon [unliftedDataConTy]
-runtimeRepTyCon :: TyCon
-runtimeRepTyCon = pcTyCon runtimeRepTyConName Nothing []
- (vecRepDataCon : tupleRepDataCon :
- sumRepDataCon : boxedRepDataCon : runtimeRepSimpleDataCons)
+unliftedRepTy :: Type
+unliftedRepTy = mkTyConTy unliftedRepTyCon
+
+----------------------
+-- | @type ZeroBitRep = 'Tuple '[]
+zeroBitRepTyCon :: TyCon
+zeroBitRepTyCon
+ = buildSynTyCon zeroBitRepTyConName [] runtimeRepTy [] rhs
+ where
+ rhs = TyCoRep.TyConApp tupleRepDataConTyCon [mkPromotedListTy runtimeRepTy []]
+
+zeroBitRepTy :: Type
+zeroBitRepTy = mkTyConTy zeroBitRepTyCon
+
+
+{- *********************************************************************
+* *
+ data Levity = Lifted | Unlifted
+* *
+********************************************************************* -}
levityTyCon :: TyCon
levityTyCon = pcTyCon levityTyConName Nothing [] [liftedDataCon,unliftedDataCon]
+levityTy :: Type
+levityTy = mkTyConTy levityTyCon
+
liftedDataCon, unliftedDataCon :: DataCon
liftedDataCon = pcSpecialDataCon liftedDataConName
[] levityTyCon LiftedInfo
unliftedDataCon = pcSpecialDataCon unliftedDataConName
[] levityTyCon UnliftedInfo
+liftedDataConTyCon :: TyCon
+liftedDataConTyCon = promoteDataCon liftedDataCon
+
+unliftedDataConTyCon :: TyCon
+unliftedDataConTyCon = promoteDataCon unliftedDataCon
+
+liftedDataConTy :: Type
+liftedDataConTy = mkTyConTy liftedDataConTyCon
+
+unliftedDataConTy :: Type
+unliftedDataConTy = mkTyConTy unliftedDataConTyCon
+
+
+{- *********************************************************************
+* *
+ See Note [Wiring in RuntimeRep]
+ data RuntimeRep = VecRep VecCount VecElem
+ | TupleRep [RuntimeRep]
+ | SumRep [RuntimeRep]
+ | BoxedRep Levity
+ | IntRep | Int8Rep | ...etc...
+* *
+********************************************************************* -}
+
+{- Note [Wiring in RuntimeRep]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The RuntimeRep type (and friends) in GHC.Types has a bunch of constructors,
+making it a pain to wire in. To ease the pain somewhat, we use lists of
+the different bits, like Uniques, Names, DataCons. These lists must be
+kept in sync with each other. The rule is this: use the order as declared
+in GHC.Types. All places where such lists exist should contain a reference
+to this Note, so a search for this Note's name should find all the lists.
+
+See also Note [Getting from RuntimeRep to PrimRep] in GHC.Types.RepType.
+-}
+
+runtimeRepTyCon :: TyCon
+runtimeRepTyCon = pcTyCon runtimeRepTyConName Nothing []
+ (vecRepDataCon : tupleRepDataCon :
+ sumRepDataCon : boxedRepDataCon : runtimeRepSimpleDataCons)
+
+runtimeRepTy :: Type
+runtimeRepTy = mkTyConTy runtimeRepTyCon
+
boxedRepDataCon :: DataCon
boxedRepDataCon = pcSpecialDataCon boxedRepDataConName
- [ mkTyConTy levityTyCon ] runtimeRepTyCon (RuntimeRep prim_rep_fun)
+ [ levityTy ] runtimeRepTyCon (RuntimeRep prim_rep_fun)
where
-- See Note [Getting from RuntimeRep to PrimRep] in RepType
prim_rep_fun [lev]
@@ -1543,6 +1628,10 @@ boxedRepDataCon = pcSpecialDataCon boxedRepDataConName
prim_rep_fun args
= pprPanic "boxedRepDataCon" (ppr args)
+
+boxedRepDataConTyCon :: TyCon
+boxedRepDataConTyCon = promoteDataCon boxedRepDataCon
+
vecRepDataCon :: DataCon
vecRepDataCon = pcSpecialDataCon vecRepDataConName [ mkTyConTy vecCountTyCon
, mkTyConTy vecElemTyCon ]
@@ -1669,30 +1758,6 @@ int8ElemRepDataConTy, int16ElemRepDataConTy, int32ElemRepDataConTy,
doubleElemRepDataConTy] = map (mkTyConTy . promoteDataCon)
vecElemDataCons
-
-liftedDataConTyCon :: TyCon
-liftedDataConTyCon = promoteDataCon liftedDataCon
-
-unliftedDataConTyCon :: TyCon
-unliftedDataConTyCon = promoteDataCon unliftedDataCon
-
-liftedDataConTy :: Type
-liftedDataConTy = mkTyConTy liftedDataConTyCon
-
-unliftedDataConTy :: Type
-unliftedDataConTy = mkTyConTy unliftedDataConTyCon
-
-boxedRepDataConTyCon :: TyCon
-boxedRepDataConTyCon = promoteDataCon boxedRepDataCon
-
--- The type ('BoxedRep 'Lifted)
-liftedRepTy :: Type
-liftedRepTy = mkTyConApp boxedRepDataConTyCon [liftedDataConTy]
-
--- The type ('BoxedRep 'Unlifted)
-unliftedRepTy :: Type
-unliftedRepTy = mkTyConApp boxedRepDataConTyCon [unliftedDataConTy]
-
{- *********************************************************************
* *
The boxed primitive types: Char, Int, etc
@@ -1735,7 +1800,7 @@ charDataCon :: DataCon
charDataCon = pcDataCon charDataConName [] [charPrimTy] charTyCon
stringTy :: Type
-stringTy = mkTyConApp stringTyCon []
+stringTy = mkTyConTy stringTyCon
stringTyCon :: TyCon
-- We have this wired-in so that Haskell literal strings
diff --git a/compiler/GHC/Builtin/Types.hs-boot b/compiler/GHC/Builtin/Types.hs-boot
index 73b6fc16fe..a8b499013a 100644
--- a/compiler/GHC/Builtin/Types.hs-boot
+++ b/compiler/GHC/Builtin/Types.hs-boot
@@ -16,27 +16,24 @@ coercibleTyCon, heqTyCon :: TyCon
unitTy :: Type
+
liftedTypeKindTyConName :: Name
-liftedTypeKind :: Kind
-unliftedTypeKind :: Kind
+liftedTypeKind, unliftedTypeKind, zeroBitTypeKind :: Kind
-liftedTypeKindTyCon :: TyCon
-unliftedTypeKindTyCon :: TyCon
+liftedTypeKindTyCon, unliftedTypeKindTyCon :: TyCon
-liftedRepTyCon :: TyCon
-unliftedRepTyCon :: TyCon
+liftedRepTyCon, unliftedRepTyCon :: TyCon
constraintKind :: Kind
runtimeRepTyCon, levityTyCon, vecCountTyCon, vecElemTyCon :: TyCon
runtimeRepTy, levityTy :: Type
-boxedRepDataConTyCon :: TyCon
-liftedDataConTyCon :: TyCon
+boxedRepDataConTyCon, liftedDataConTyCon :: TyCon
vecRepDataConTyCon, tupleRepDataConTyCon :: TyCon
-liftedRepTy, unliftedRepTy :: Type
+liftedRepTy, unliftedRepTy, zeroBitRepTy :: Type
liftedDataConTy, unliftedDataConTy :: Type
intRepDataConTy,
diff --git a/compiler/GHC/Builtin/Types/Prim.hs b/compiler/GHC/Builtin/Types/Prim.hs
index 32ceb36a2d..7ba9023f25 100644
--- a/compiler/GHC/Builtin/Types/Prim.hs
+++ b/compiler/GHC/Builtin/Types/Prim.hs
@@ -46,7 +46,7 @@ module GHC.Builtin.Types.Prim(
tYPETyCon, tYPETyConName,
-- Kinds
- tYPE, primRepToRuntimeRep, primRepsToRuntimeRep,
+ mkTYPEapp, primRepToRuntimeRep, primRepsToRuntimeRep,
functionWithMultiplicity,
funTyCon, funTyConName,
@@ -113,7 +113,7 @@ import GHC.Prelude
import {-# SOURCE #-} GHC.Builtin.Types
( runtimeRepTy, levityTy, unboxedTupleKind, liftedTypeKind
, boxedRepDataConTyCon, vecRepDataConTyCon, tupleRepDataConTyCon
- , liftedRepTy, unliftedRepTy
+ , liftedRepTy, unliftedRepTy, zeroBitRepTy
, intRepDataConTy
, int8RepDataConTy, int16RepDataConTy, int32RepDataConTy, int64RepDataConTy
, wordRepDataConTy
@@ -142,7 +142,7 @@ import GHC.Utils.Outputable
import GHC.Utils.Panic
import GHC.Core.TyCo.Rep -- Doesn't need special access, but this is easier to avoid
-- import loops which show up if you import Type instead
-import {-# SOURCE #-} GHC.Core.Type ( mkTyConTy, mkTyConApp, tYPE )
+import {-# SOURCE #-} GHC.Core.Type ( mkTyConTy, mkTyConApp, mkTYPEapp )
import Data.Char
@@ -400,7 +400,7 @@ alphaTy, betaTy, gammaTy, deltaTy :: Type
(alphaTy:betaTy:gammaTy:deltaTy:_) = alphaTys
alphaTyVarsUnliftedRep :: [TyVar]
-alphaTyVarsUnliftedRep = mkTemplateTyVars $ repeat (tYPE unliftedRepTy)
+alphaTyVarsUnliftedRep = mkTemplateTyVars $ repeat (mkTYPEapp unliftedRepTy)
alphaTyVarUnliftedRep :: TyVar
(alphaTyVarUnliftedRep:_) = alphaTyVarsUnliftedRep
@@ -427,7 +427,7 @@ openAlphaTyVar, openBetaTyVar, openGammaTyVar :: TyVar
-- beta :: TYPE r2
-- gamma :: TYPE r3
[openAlphaTyVar,openBetaTyVar,openGammaTyVar]
- = mkTemplateTyVars [tYPE runtimeRep1Ty, tYPE runtimeRep2Ty, tYPE runtimeRep3Ty]
+ = mkTemplateTyVars [mkTYPEapp runtimeRep1Ty, mkTYPEapp runtimeRep2Ty, mkTYPEapp runtimeRep3Ty]
openAlphaTyVarSpec, openBetaTyVarSpec, openGammaTyVarSpec :: TyVarBinder
openAlphaTyVarSpec = mkTyVarBinder Specified openAlphaTyVar
@@ -456,8 +456,8 @@ levity2Ty = mkTyVarTy levity2TyVar
levPolyAlphaTyVar, levPolyBetaTyVar :: TyVar
[levPolyAlphaTyVar, levPolyBetaTyVar] =
mkTemplateTyVars
- [tYPE (mkTyConApp boxedRepDataConTyCon [levity1Ty])
- ,tYPE (mkTyConApp boxedRepDataConTyCon [levity2Ty])]
+ [mkTYPEapp (mkTyConApp boxedRepDataConTyCon [levity1Ty])
+ ,mkTYPEapp (mkTyConApp boxedRepDataConTyCon [levity2Ty])]
-- alpha :: TYPE ('BoxedRep l)
-- beta :: TYPE ('BoxedRep k)
@@ -513,8 +513,8 @@ funTyCon = mkFunTyCon funTyConName tc_bndrs tc_rep_nm
tc_bndrs = [ mkNamedTyConBinder Required multiplicityTyVar1
, mkNamedTyConBinder Inferred runtimeRep1TyVar
, mkNamedTyConBinder Inferred runtimeRep2TyVar ]
- ++ mkTemplateAnonTyConBinders [ tYPE runtimeRep1Ty
- , tYPE runtimeRep2Ty
+ ++ mkTemplateAnonTyConBinders [ mkTYPEapp runtimeRep1Ty
+ , mkTYPEapp runtimeRep2Ty
]
tc_rep_nm = mkPrelTyConRepName funTyConName
@@ -651,13 +651,13 @@ pcPrimTyCon name roles rep
= mkPrimTyCon name binders result_kind roles
where
binders = mkTemplateAnonTyConBinders (map (const liftedTypeKind) roles)
- result_kind = tYPE (primRepToRuntimeRep rep)
+ result_kind = mkTYPEapp (primRepToRuntimeRep rep)
-- | Convert a 'PrimRep' to a 'Type' of kind RuntimeRep
-- Defined here to avoid (more) module loops
primRepToRuntimeRep :: PrimRep -> Type
primRepToRuntimeRep rep = case rep of
- VoidRep -> mkTupleRep []
+ VoidRep -> zeroBitRepTy
LiftedRep -> liftedRepTy
UnliftedRep -> unliftedRepTy
IntRep -> intRepDataConTy