diff options
author | Simon Peyton Jones <simonpj@microsoft.com> | 2018-07-27 09:01:46 +0100 |
---|---|---|
committer | Simon Peyton Jones <simonpj@microsoft.com> | 2018-07-27 09:16:11 +0100 |
commit | f265008fb6f70830e7e92ce563f6d83833cef071 (patch) | |
tree | 08b37ad197099b9d614386ea92416450038956ea /compiler/prelude/PrelNames.hs | |
parent | 4c571f3321eb8f7a06dada4c37822c22bbdd148b (diff) | |
download | haskell-f265008fb6f70830e7e92ce563f6d83833cef071.tar.gz |
Refactor (~) to reduce the suerpclass stack
The constraint (~) used to be (effectively):
class a ~~ b => (a :: k) ~ (b :: k)
but, with this patch, it is now defined uniformly with
(~~) and Coercible like this:
class a ~# b => (a :: k) ~ (b :: k)
Result:
* One less superclass selection when goinng from (~) to (~#)
Better for compile time and better for debugging with -ddump-simpl
* The code for (~), (~~), and Coercible looks uniform, and appears
together, e.g. in TysWiredIn and ClsInst.matchGlobalInst.
Previously the code for (~) was different, and unique.
Not only is this simpler, but it also makes the compiler a bit faster;
T12227: 9% less allocation
T12545: 7% less allocation
This patch fixes Trac #15421
Diffstat (limited to 'compiler/prelude/PrelNames.hs')
-rw-r--r-- | compiler/prelude/PrelNames.hs | 40 |
1 files changed, 17 insertions, 23 deletions
diff --git a/compiler/prelude/PrelNames.hs b/compiler/prelude/PrelNames.hs index d971a8be90..90f1f44713 100644 --- a/compiler/prelude/PrelNames.hs +++ b/compiler/prelude/PrelNames.hs @@ -393,7 +393,7 @@ basicKnownKeyNames -- The Ordering type , orderingTyConName - , ltDataConName, eqDataConName, gtDataConName + , ordLTDataConName, ordEQDataConName, ordGTDataConName -- The SPEC type for SpecConstr , specTyConName @@ -433,9 +433,6 @@ basicKnownKeyNames , typeErrorVAppendDataConName , typeErrorShowTypeDataConName - -- homogeneous equality - , eqTyConName - ] ++ case cIntegerLibraryType of IntegerGMP -> [integerSDataConName,naturalSDataConName] IntegerSimple -> [] @@ -859,9 +856,6 @@ traverse_RDR = varQual_RDR dATA_TRAVERSABLE (fsLit "traverse") mempty_RDR = varQual_RDR gHC_BASE (fsLit "mempty") mappend_RDR = varQual_RDR gHC_BASE (fsLit "mappend") -eqTyCon_RDR :: RdrName -eqTyCon_RDR = tcQual_RDR dATA_TYPE_EQUALITY (fsLit "~") - ---------------------- varQual_RDR, tcQual_RDR, clsQual_RDR, dataQual_RDR :: Module -> FastString -> RdrName @@ -889,11 +883,11 @@ runMainIOName, runRWName :: Name runMainIOName = varQual gHC_TOP_HANDLER (fsLit "runMainIO") runMainKey runRWName = varQual gHC_MAGIC (fsLit "runRW#") runRWKey -orderingTyConName, ltDataConName, eqDataConName, gtDataConName :: Name +orderingTyConName, ordLTDataConName, ordEQDataConName, ordGTDataConName :: Name orderingTyConName = tcQual gHC_TYPES (fsLit "Ordering") orderingTyConKey -ltDataConName = dcQual gHC_TYPES (fsLit "LT") ltDataConKey -eqDataConName = dcQual gHC_TYPES (fsLit "EQ") eqDataConKey -gtDataConName = dcQual gHC_TYPES (fsLit "GT") gtDataConKey +ordLTDataConName = dcQual gHC_TYPES (fsLit "LT") ordLTDataConKey +ordEQDataConName = dcQual gHC_TYPES (fsLit "EQ") ordEQDataConKey +ordGTDataConName = dcQual gHC_TYPES (fsLit "GT") ordGTDataConKey specTyConName :: Name specTyConName = tcQual gHC_TYPES (fsLit "SPEC") specTyConKey @@ -1531,10 +1525,6 @@ fingerprintDataConName :: Name fingerprintDataConName = dcQual gHC_FINGERPRINT_TYPE (fsLit "Fingerprint") fingerprintDataConKey --- homogeneous equality. See Note [The equality types story] in TysPrim -eqTyConName :: Name -eqTyConName = tcQual dATA_TYPE_EQUALITY (fsLit "~") eqTyConKey - {- ************************************************************************ * * @@ -1916,7 +1906,7 @@ charDataConKey, consDataConKey, doubleDataConKey, falseDataConKey, floatDataConKey, intDataConKey, integerSDataConKey, nilDataConKey, ratioDataConKey, stableNameDataConKey, trueDataConKey, wordDataConKey, word8DataConKey, ioDataConKey, integerDataConKey, heqDataConKey, - coercibleDataConKey, nothingDataConKey, justDataConKey :: Unique + coercibleDataConKey, eqDataConKey, nothingDataConKey, justDataConKey :: Unique charDataConKey = mkPreludeDataConUnique 1 consDataConKey = mkPreludeDataConUnique 2 @@ -1927,6 +1917,7 @@ intDataConKey = mkPreludeDataConUnique 6 integerSDataConKey = mkPreludeDataConUnique 7 nothingDataConKey = mkPreludeDataConUnique 8 justDataConKey = mkPreludeDataConUnique 9 +eqDataConKey = mkPreludeDataConUnique 10 nilDataConKey = mkPreludeDataConUnique 11 ratioDataConKey = mkPreludeDataConUnique 12 word8DataConKey = mkPreludeDataConUnique 13 @@ -1948,10 +1939,11 @@ leftDataConKey, rightDataConKey :: Unique leftDataConKey = mkPreludeDataConUnique 25 rightDataConKey = mkPreludeDataConUnique 26 -ltDataConKey, eqDataConKey, gtDataConKey :: Unique -ltDataConKey = mkPreludeDataConUnique 27 -eqDataConKey = mkPreludeDataConUnique 28 -gtDataConKey = mkPreludeDataConUnique 29 +ordLTDataConKey, ordEQDataConKey, ordGTDataConKey :: Unique +ordLTDataConKey = mkPreludeDataConUnique 27 +ordEQDataConKey = mkPreludeDataConUnique 28 +ordGTDataConKey = mkPreludeDataConUnique 29 + coercibleDataConKey = mkPreludeDataConUnique 32 @@ -2376,12 +2368,14 @@ starArrStarArrStarKindRepKey = mkPreludeMiscIdUnique 522 -- Dynamic toDynIdKey :: Unique -toDynIdKey = mkPreludeMiscIdUnique 550 +toDynIdKey = mkPreludeMiscIdUnique 523 + bitIntegerIdKey :: Unique -bitIntegerIdKey = mkPreludeMiscIdUnique 551 +bitIntegerIdKey = mkPreludeMiscIdUnique 550 -heqSCSelIdKey, coercibleSCSelIdKey :: Unique +heqSCSelIdKey, eqSCSelIdKey, coercibleSCSelIdKey :: Unique +eqSCSelIdKey = mkPreludeMiscIdUnique 551 heqSCSelIdKey = mkPreludeMiscIdUnique 552 coercibleSCSelIdKey = mkPreludeMiscIdUnique 553 |