[commit: ghc] wip/T9858-typeable-ben: Generate Typeable info at definition sites (8c3a2ed)
git at git.haskell.org
git at git.haskell.org
Wed Oct 28 10:16:44 UTC 2015
Repository : ssh://git@git.haskell.org/ghc
On branch : wip/T9858-typeable-ben
Link : http://ghc.haskell.org/trac/ghc/changeset/8c3a2ed0f36c3565f0cd37f50324bdde299bdb0e/ghc
>---------------------------------------------------------------
commit 8c3a2ed0f36c3565f0cd37f50324bdde299bdb0e
Author: Ben Gamari <ben at smart-cactus.org>
Date: Wed Aug 26 18:24:34 2015 +0200
Generate Typeable info at definition sites
This patch implements the idea floated in Trac #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 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.
* Cleanup handling of knownKeyNames
* Each TyCon, including promoted TyCons, contains its TyConRepName, if
it has one. This is, in effect, the name of its Typeable instance.
* Move mkDefaultMethodIds, mkRecSelBinds from TcTyClsDecls to TcTyDecls
>---------------------------------------------------------------
8c3a2ed0f36c3565f0cd37f50324bdde299bdb0e
compiler/basicTypes/DataCon.hs | 222 ++++++++---
compiler/basicTypes/OccName.hs | 6 +-
compiler/basicTypes/Unique.hs | 51 ++-
compiler/coreSyn/MkCore.hs | 8 +-
compiler/deSugar/DsBinds.hs | 281 +++++++------
compiler/deSugar/DsExpr.hs | 14 +-
compiler/deSugar/DsUtils.hs | 14 +-
compiler/ghc.cabal.in | 1 +
compiler/hsSyn/HsUtils.hs | 6 +-
compiler/iface/BuildTyCl.hs | 42 +-
compiler/iface/IfaceSyn.hs | 100 +++--
compiler/iface/MkIface.hs | 9 +-
compiler/iface/TcIface.hs | 89 +++--
compiler/main/HscMain.hs | 13 +-
compiler/main/HscTypes.hs | 12 +-
compiler/prelude/PrelInfo.hs | 111 +++---
compiler/prelude/PrelNames.hs | 88 +++--
compiler/prelude/THNames.hs | 105 +++--
compiler/prelude/TysPrim.hs | 38 +-
compiler/prelude/TysWiredIn.hs | 55 ++-
compiler/simplCore/FloatIn.hs | 4 +-
compiler/typecheck/TcBinds.hs | 35 +-
compiler/typecheck/TcEnv.hs | 5 +-
compiler/typecheck/TcEvidence.hs | 69 ++--
compiler/typecheck/TcGenGenerics.hs | 41 +-
compiler/typecheck/TcHsSyn.hs | 27 +-
compiler/typecheck/TcHsType.hs | 8 +-
compiler/typecheck/TcInstDcls.hs | 19 +-
compiler/typecheck/TcInteract.hs | 440 ++++++++++++---------
compiler/typecheck/TcPatSyn.hs | 4 +-
compiler/typecheck/TcRnDriver.hs | 40 +-
compiler/typecheck/TcRnMonad.hs | 2 +-
compiler/typecheck/TcRnTypes.hs | 7 +-
compiler/typecheck/TcTyClsDecls.hs | 323 +++------------
compiler/typecheck/TcTyDecls.hs | 330 ++++++++++++----
compiler/typecheck/TcTypeNats.hs | 12 +-
compiler/typecheck/TcTypeable.hs | 206 ++++++++++
compiler/types/TyCon.hs | 409 +++++++++++--------
compiler/types/Type.hs | 9 +
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 +-
ghc/InteractiveUI.hs | 4 +-
libraries/base/Data/Typeable.hs | 3 +-
libraries/base/Data/Typeable/Internal.hs | 330 ++++++++++------
libraries/base/GHC/Show.hs | 10 +
libraries/base/GHC/Stack/Types.hs | 13 +
libraries/ghc-prim/GHC/Classes.hs | 36 +-
libraries/ghc-prim/GHC/Magic.hs | 2 +
libraries/ghc-prim/GHC/Tuple.hs | 3 +
libraries/ghc-prim/GHC/Types.hs | 54 ++-
.../tests/deSugar/should_compile/T2431.stderr | 29 +-
testsuite/tests/deriving/should_fail/T10524.stderr | 5 +-
testsuite/tests/deriving/should_fail/T9687.stderr | 4 +-
testsuite/tests/ghci.debugger/scripts/T2740.stdout | 2 +-
.../tests/ghci.debugger/scripts/break006.stderr | 4 +-
.../tests/ghci.debugger/scripts/break009.stdout | 4 +-
.../tests/ghci.debugger/scripts/break010.stdout | 4 +-
.../tests/ghci.debugger/scripts/break011.stdout | 8 +-
.../tests/ghci.debugger/scripts/break012.stdout | 16 +-
.../tests/ghci.debugger/scripts/break018.stdout | 4 +-
.../ghci.debugger/scripts/break022/break022.stdout | 2 +-
.../tests/ghci.debugger/scripts/break028.stdout | 6 +-
.../tests/ghci.debugger/scripts/print018.stdout | 6 +-
.../tests/ghci.debugger/scripts/print019.stderr | 4 +-
.../tests/ghci.debugger/scripts/print031.stdout | 2 +-
testsuite/tests/ghci/scripts/T8674.stdout | 4 +-
.../indexed-types/should_compile/T3017.stderr | 2 +-
.../tests/numeric/should_compile/T7116.stdout | 58 ++-
.../should_fail/overloadedlistsfail01.stderr | 4 +-
testsuite/tests/polykinds/T8132.stderr | 4 +-
testsuite/tests/quasiquotation/T7918.stdout | 3 +
testsuite/tests/roles/should_compile/Roles1.stderr | 61 +++
.../tests/roles/should_compile/Roles13.stderr | 53 ++-
.../tests/roles/should_compile/Roles14.stderr | 7 +
testsuite/tests/roles/should_compile/Roles2.stderr | 13 +
testsuite/tests/roles/should_compile/Roles3.stderr | 25 ++
testsuite/tests/roles/should_compile/Roles4.stderr | 13 +
testsuite/tests/roles/should_compile/T8958.stderr | 9 +-
.../tests/simplCore/should_compile/T3234.stderr | 4 +-
.../tests/simplCore/should_compile/T3717.stderr | 29 +-
.../tests/simplCore/should_compile/T3772.stdout | 29 +-
.../tests/simplCore/should_compile/T4908.stderr | 29 +-
.../tests/simplCore/should_compile/T4930.stderr | 29 +-
.../tests/simplCore/should_compile/T7360.stderr | 47 ++-
.../tests/simplCore/should_compile/T8274.stdout | 10 +-
.../tests/simplCore/should_compile/T9400.stderr | 17 +-
.../tests/simplCore/should_compile/rule2.stderr | 3 +-
.../simplCore/should_compile/spec-inline.stderr | 29 +-
.../tests/stranal/should_compile/T10694.stdout | 3 +
.../stranal/sigs/BottomFromInnerLambda.stderr | 1 +
testsuite/tests/stranal/sigs/DmdAnalGADTs.stderr | 2 +
testsuite/tests/stranal/sigs/HyperStrUse.stderr | 1 +
testsuite/tests/stranal/sigs/StrAnalExample.stderr | 1 +
testsuite/tests/stranal/sigs/T8569.stderr | 2 +
testsuite/tests/stranal/sigs/T8598.stderr | 1 +
testsuite/tests/stranal/sigs/UnsatFun.stderr | 1 +
testsuite/tests/th/TH_Roles2.stderr | 8 +
.../tests/typecheck/should_compile/holes2.stderr | 13 +-
testsuite/tests/typecheck/should_fail/T5095.stderr | 2 +-
.../tests/typecheck/should_fail/T9858a.stderr | 6 +-
.../tests/typecheck/should_fail/T9858b.stderr | 5 +-
.../should_fail/TcStaticPointersFail02.stderr | 4 +-
.../tests/typecheck/should_fail/tcfail072.stderr | 4 +-
.../tests/typecheck/should_fail/tcfail133.stderr | 14 +-
106 files changed, 2838 insertions(+), 1548 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 8c3a2ed0f36c3565f0cd37f50324bdde299bdb0e
More information about the ghc-commits
mailing list