Lift constructor tag allocation out of a loop
authorBartosz Nitka <niteria@gmail.com>
Fri, 5 Jan 2018 15:20:05 +0000 (15:20 +0000)
committerBartosz Nitka <niteria@gmail.com>
Wed, 10 Jan 2018 13:50:56 +0000 (13:50 +0000)
commitdbdf77d92c9cd0bbb269137de0bf8754573cdc1e
tree17bbe7fb388308615ba009e4f887c719c9e58107
parent1577908f2a9db0fcf6f749d40dd75481015f5497
Lift constructor tag allocation out of a loop

Before this change, for each constructor that we want
to allocate a tag for we would traverse a list of all
the constructors in a datatype to determine which tag
a constructor should get.

This is obviously quadratic and for datatypes with 10k
constructors it actually makes a big difference.

This change implements the plan outlined by @simonpj in
https://mail.haskell.org/pipermail/ghc-devs/2017-October/014974.html
which is basically about using a map and constructing it outside the
loop.

One place where things got a bit awkward was TysWiredIn.hs,
it would have been possible to just assign the tags by hand, but
that seemed error-prone to me, so I decided to go through a map
there as well.

Test Plan:
./validate
On a file with 10k constructors
Before:
   8,130,522,344 bytes allocated in the heap
  Total   time    3.682s  (  3.920s elapsed)
After:
   4,133,478,744 bytes allocated in the heap
  Total   time    2.509s  (  2.750s elapsed)

Reviewers: simonpj, bgamari

Reviewed By: simonpj

Subscribers: goldfire, rwbarton, thomie, simonmar, carter, simonpj

GHC Trac Issues: #14657

Differential Revision: https://phabricator.haskell.org/D4289
compiler/basicTypes/DataCon.hs
compiler/iface/BuildTyCl.hs
compiler/iface/TcIface.hs
compiler/prelude/TysWiredIn.hs
compiler/typecheck/TcTyClsDecls.hs
compiler/types/TyCon.hs
compiler/vectorise/Vectorise/Generic/PData.hs
compiler/vectorise/Vectorise/Type/TyConDecl.hs
testsuite/tests/perf/compiler/all.T
testsuite/tests/perf/compiler/genManyConstructors [new file with mode: 0755]