[commit: ghc] wip/T9858-typeable-spj: Generate Typeble info at definition sites (fe510d9)
git at git.haskell.org
git at git.haskell.org
Thu Mar 26 12:41:15 UTC 2015
Repository : ssh://git@git.haskell.org/ghc
On branch : wip/T9858-typeable-spj
Link : http://ghc.haskell.org/trac/ghc/changeset/fe510d911b6cf61d6884b8b42d8771d4aea3229f/ghc
>---------------------------------------------------------------
commit fe510d911b6cf61d6884b8b42d8771d4aea3229f
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date: Mon Mar 23 14:50:23 2015 +0000
Generate Typeble info at definition sites
This patch implements the idea floated in #9858, namely that we should
generate type-representation information at the data type declaration
site, rather than when solving a Typeable constraint.
However, this turned out quite a bit harder than I expected. I still
think it's the right thing to do, and it's done now, but it was quite
a struggle.
See particularly
* Note [Grand plan for Typeable] in TcTypeable (which is a new module)
* Note [The overall promotion story] in DataCon (clarifies existing stuff)
The most painful bit was that to generate Typeable instances (ie TyConRepName
bindings) for every TyCon is tricky for types in ghc-prim etc:
- we need to have enough data types around to *define* a TyCon
- many of these types are wired-in
Also, to minimise the code generated for each data type, I wanted to generate
pure data, not CAFs with unpackCString# stuff floating about.
Performance
~~~~~~~~~~~
Three perf/compiler tests start to allocate quite a bit more. This isn't surprising,
because they all allocate zillions of data types, with practically no other code,
esp T1969
T1969: GHC allocates 30% more
T5642: GHC allocates 14% more
T9872d: GHC allocates 5% more
I'm treating this as acceptable. The payoff comes in Typeable-heavy code.
Remaining to do
~~~~~~~~~~~~~~~
* I think that "TyCon" and "Module" are over-generic names to use for
the runtime type representations used in GHC.Typeable. Better might
be "TrTyCon" and "TrModule". But I have not yet done this
* Add more info the the "TyCon" e.g. source location where it was defined
* Use the new "Module" type to help with Trac #10068
* It would be possible to generate TyConRepName (ie Typeable instances)
selectively rather than all the time. We'd need to persist the information
in interface files. Lacking a motivating reason I have not done this, but
it would not be difficult.
Refactoring
~~~~~~~~~~~
As is so often the case, I ended up refactoring more than I intended.
In particular
* In TyCon,
- a type *family* (whether type or data)
is repesented by a FamilyTyCon
- a algebraic data type (including data/newtype instances)
is represented by AlgTyCon
This wasn't true before; a data family was represented as
an AlgTyCon. There are some corresponding changes in IfaceSyn.
Also get rid of the (unhelpfully named) tyConParent.
* In TyCon define 'Promoted', isomorphic to Maybe, used when things
are optionally promoted; and use it elsewhere in GHC.
* Each TyCon, including promoted TyCons, contains its TyConRepName,
if it has one. This is, in effect, the name of its Typeable
instance.
* I added PatSynId, DefMethId, and ReflectionId to the IdInfo.IdDetails
type. They are used for debugging only, namely to suppress excessive
output in -ddump-types.
* Tidy up the generation of PrelInfo.knownKeyNames
* Move newImplicitBinder from IfaceEnv to BuildTyCl
* PrelNames.conName renamed to dcQual for consistency with varQual, tcQual
* Move mkDefaultMethodIds, mkRecSelBinds from TcTyClsDecls to TcTyDecls
>---------------------------------------------------------------
fe510d911b6cf61d6884b8b42d8771d4aea3229f
compiler/basicTypes/DataCon.hs | 256 +++++++++++-----
compiler/basicTypes/IdInfo.hs | 19 +-
compiler/basicTypes/OccName.hs | 19 +-
compiler/basicTypes/Unique.hs | 59 ++--
compiler/deSugar/DsBinds.hs | 270 ++++++++--------
compiler/ghc.cabal.in | 1 +
compiler/hsSyn/HsUtils.hs | 6 +-
compiler/iface/BinIface.hs | 10 +-
compiler/iface/BuildTyCl.hs | 73 +++--
compiler/iface/IfaceEnv.hs | 33 +-
compiler/iface/IfaceSyn.hs | 86 +++---
compiler/iface/MkIface.hs | 25 +-
compiler/iface/TcIface.hs | 67 ++--
compiler/main/HscMain.hs | 10 +-
compiler/main/HscTypes.hs | 20 +-
compiler/prelude/PrelInfo.hs | 66 ++--
compiler/prelude/PrelNames.hs | 122 +++++---
compiler/prelude/TysPrim.hs | 42 +--
compiler/prelude/TysWiredIn.hs | 188 ++++++------
compiler/typecheck/TcBinds.hs | 35 ++-
compiler/typecheck/TcDeriv.hs | 86 +-----
compiler/typecheck/TcEvidence.hs | 37 +--
compiler/typecheck/TcGenGenerics.hs | 38 ++-
compiler/typecheck/TcHsSyn.hs | 28 +-
compiler/typecheck/TcHsType.hs | 8 +-
compiler/typecheck/TcInstDcls.hs | 26 +-
compiler/typecheck/TcInteract.hs | 203 +++++++-----
compiler/typecheck/TcPatSyn.hs | 4 +-
compiler/typecheck/TcRnDriver.hs | 43 +--
compiler/typecheck/TcRnMonad.hs | 2 +-
compiler/typecheck/TcRnTypes.hs | 7 +-
compiler/typecheck/TcTyClsDecls.hs | 324 ++++----------------
compiler/typecheck/TcTyDecls.hs | 325 ++++++++++++++++----
compiler/typecheck/TcType.hs | 0
compiler/typecheck/TcTypeNats.hs | 10 +-
compiler/typecheck/TcTypeable.hs | 202 ++++++++++++
compiler/types/TyCon.hs | 407 ++++++++++++++-----------
compiler/types/Type.hs | 12 +
compiler/utils/Binary.hs | 11 +-
compiler/vectorise/Vectorise/Generic/PData.hs | 4 +-
compiler/vectorise/Vectorise/Type/Env.hs | 4 +-
compiler/vectorise/Vectorise/Type/TyConDecl.hs | 7 +-
libraries/base/Data/Typeable.hs | 3 +-
libraries/base/Data/Typeable/Internal.hs | 331 +++++++++++++-------
libraries/base/GHC/Show.hs | 10 +
libraries/ghc-prim/GHC/Classes.hs | 46 ++-
libraries/ghc-prim/GHC/IntWord64.hs | 3 +
libraries/ghc-prim/GHC/Magic.hs | 2 +
libraries/ghc-prim/GHC/Tuple.hs | 3 +
libraries/ghc-prim/GHC/TyCon.hs | 15 +
libraries/ghc-prim/GHC/Types.hs | 51 +++-
51 files changed, 2177 insertions(+), 1482 deletions(-)
Diff suppressed because of size. To see it, use:
git diff-tree --root --patch-with-stat --no-color --find-copies-harder --ignore-space-at-eol --cc fe510d911b6cf61d6884b8b42d8771d4aea3229f
More information about the ghc-commits
mailing list