Implement new integer-gmp2 from scratch (re #9281)
authorHerbert Valerio Riedel <hvr@gnu.org>
Sun, 19 Oct 2014 18:37:40 +0000 (20:37 +0200)
committerHerbert Valerio Riedel <hvr@gnu.org>
Wed, 12 Nov 2014 10:03:42 +0000 (11:03 +0100)
commitc774b28f76ee4c220f7c1c9fd81585e0e3af0e8a
tree9fc156d8e3c7d8fd414b572826f139c1efa5f34c
parentfcfc87dce752c3c1702eeb54d1023213729f1832
Implement new integer-gmp2 from scratch (re #9281)

This is done as a separate `integer-gmp2` backend library because it
turned out to become a complete rewrite from scratch.

Due to the different (over)allocation scheme and potentially different
accounting (via the new `{shrink,resize}MutableByteArray#` primitives),
some of the nofib benchmarks actually results in increased allocation
numbers (but not necessarily an increase in runtime!).  I believe the
allocation numbers could improve if `{resize,shrink}MutableByteArray#`
could be optimised to reallocate in-place more efficiently.

Here are the more apparent changes in the latest nofib comparision
between `integer-gmp` and `integer-gmp2`:

  ------------------------------------------------------------------
          Program     Size    Allocs   Runtime   Elapsed  TotalMem
  ------------------------------------------------------------------
              ...
       bernouilli    +1.6%    +15.3%     0.132     0.132      0.0%
              ...
     cryptarithm1    -2.2%      0.0%     -9.7%     -9.7%      0.0%
              ...
            fasta    -0.7%     -0.0%    +10.9%    +10.9%      0.0%
              ...
            kahan    +0.6%    +38.9%     0.169     0.169      0.0%
              ...
             lcss    -0.7%     -0.0%     -6.4%     -6.4%      0.0%
              ...
           mandel    +1.6%    +33.6%     0.049     0.049      0.0%
              ...
         pidigits    +0.8%     +8.5%     +3.9%     +3.9%      0.0%
            power    +1.4%    -23.8%    -18.6%    -18.6%    -16.7%
              ...
        primetest    +1.3%    +50.1%     0.085     0.085      0.0%
              ...
              rsa    +1.6%    +53.4%     0.026     0.026      0.0%
              ...
              scs    +1.2%     +6.6%     +6.5%     +6.6%    +14.3%
              ...
           symalg    +1.0%     +9.5%     0.010     0.010      0.0%
              ...
        transform    -0.6%     -0.0%     -5.9%     -5.9%      0.0%
              ...
  ------------------------------------------------------------------
              Min    -2.3%    -23.8%    -18.6%    -18.6%    -16.7%
              Max    +1.6%    +53.4%    +10.9%    +10.9%    +14.3%
   Geometric Mean    -0.3%     +1.9%     -0.8%     -0.8%     +0.0%

(see P35 / https://phabricator.haskell.org/P35 for full report)

By default, `INTEGER_LIBRARY=integer-gmp2` is active now, which results
in the package `integer-gmp-1.0.0.0` being registered in the package db.
The previous `integer-gmp-0.5.1.0` can be restored by setting
`INTEGER_LIBRARY=integer-gmp` (but will probably be removed altogether
for GHC 7.12). In-tree GMP support has been stolen from the old
`integer-gmp` (while unpatching the custom memory-allocators, as well as
forcing `-fPIC`)

A minor hack to `ghc-cabal` was necessary in order to support two different
`integer-gmp` packages (in different folders) with the same package key.

There will be a couple of follow-up commits re-implementing some features
that were dropped to keep D82 minimal, as well as further
clean-ups/improvements.

More information can be found via #9281 and
https://ghc.haskell.org/trac/ghc/wiki/Design/IntegerGmp2

Reviewed By: austin, rwbarton, simonmar

Differential Revision: https://phabricator.haskell.org/D82
40 files changed:
compiler/basicTypes/Module.lhs
compiler/coreSyn/CorePrep.lhs
compiler/ghc.mk
compiler/prelude/PrelNames.lhs
ghc.mk
libraries/base/GHC/Real.hs
libraries/base/base.cabal
libraries/integer-gmp2/.gitignore [new file with mode: 0644]
libraries/integer-gmp2/LICENSE [new file with mode: 0644]
libraries/integer-gmp2/Setup.hs [new file with mode: 0644]
libraries/integer-gmp2/aclocal.m4 [new file with mode: 0644]
libraries/integer-gmp2/cbits/wrappers.c [new file with mode: 0644]
libraries/integer-gmp2/changelog.md [new file with mode: 0644]
libraries/integer-gmp2/config.guess [new file with mode: 0755]
libraries/integer-gmp2/config.sub [new file with mode: 0755]
libraries/integer-gmp2/configure.ac [new file with mode: 0644]
libraries/integer-gmp2/gmp/config.mk.in [new file with mode: 0644]
libraries/integer-gmp2/gmp/ghc.mk [new file with mode: 0644]
libraries/integer-gmp2/gmp/gmpsrc.patch [new file with mode: 0644]
libraries/integer-gmp2/gmp/ln [new file with mode: 0755]
libraries/integer-gmp2/include/HsIntegerGmp.h.in [new file with mode: 0644]
libraries/integer-gmp2/integer-gmp.buildinfo.in [new file with mode: 0644]
libraries/integer-gmp2/integer-gmp.cabal [new file with mode: 0644]
libraries/integer-gmp2/src/GHC/Integer.hs [new file with mode: 0644]
libraries/integer-gmp2/src/GHC/Integer/GMP/Internals.hs [new file with mode: 0644]
libraries/integer-gmp2/src/GHC/Integer/Logarithms.hs [new file with mode: 0644]
libraries/integer-gmp2/src/GHC/Integer/Logarithms/Internals.hs [new file with mode: 0644]
libraries/integer-gmp2/src/GHC/Integer/Type.hs [new file with mode: 0644]
mk/config.mk.in
rules/foreachLibrary.mk
testsuite/tests/ghci/scripts/ghci025.stdout
testsuite/tests/lib/integer/all.T
testsuite/tests/llvm/should_compile/all.T
testsuite/tests/perf/should_run/all.T
testsuite/tests/perf/space_leaks/all.T
testsuite/tests/safeHaskell/check/pkg01/all.T
testsuite/tests/simplCore/should_run/T5603.hs
testsuite/tests/typecheck/should_fail/T5095.stderr
testsuite/tests/typecheck/should_fail/tcfail072.stderr
utils/ghc-cabal/Main.hs