1. 21 Nov, 2014 1 commit
    • Herbert Valerio Riedel's avatar
      Hide `Data.OldList` module · e888b943
      Herbert Valerio Riedel authored
      The `Data.OldList` module was originally created in
      3daf0023 to provide a way to access the
      original list-specialised functions from `Data.List`. It was also made
      an exposed module in order to facilitate adapting the
      `haskell2010`/`haskell98` packages. However, since the
      `haskell2010`/`haskell98` packages were dropped, we no longer need to
      expose `Data.OldList`.
      Depends on D511
      Reviewers: ekmett, austin
      Reviewed By: ekmett, austin
      Subscribers: thomie, carter
      Differential Revision: https://phabricator.haskell.org/D513
  2. 20 Nov, 2014 2 commits
  3. 19 Nov, 2014 1 commit
  4. 18 Nov, 2014 6 commits
  5. 13 Nov, 2014 5 commits
    • David Feuer's avatar
      Implement amap/coerce for Array (re #9796) · 603b7be7
      David Feuer authored
      Implement an `amap`/`coerce` rule in `GHC.Arr` to match the
      `map`/`coerce` rule in GHC.Base.
      In order to do so, delay inlining `amap` until phase 1.
      To prevent the inlining delay from causing major inefficiencies due to
      missed list fusion, rewrite `amap` to avoid relying on list fusion. This
      has the extra benefit of reducing the size of the compiled amap code by
      skipping the impossible case of an array with a negative size.
      Reviewed By: nomeata
      Differential Revision: https://phabricator.haskell.org/D471
    • David Feuer's avatar
      Improve `Foldable` instance for `Array` · 212a3505
      David Feuer authored
      Previously, `Array`s were simply converted to lists, and the list
      methods used. That works acceptably well for `foldr` and `foldr1`, but
      not so sensibly for most other things. Left folds ended up "twisted" the
      way they are for lists, leading to surprising performance
      Moreover, this implements `length` and `null` so they check the array
      size directly.
      Finally, a test is added to the testsuite ensuring the overridden
      `Foldable` methods agree with their expected default semantics.
      Addresses #9763
      Reviewed By: hvr, austin
      Differential Revision: https://phabricator.haskell.org/D459
    • David Feuer's avatar
      base: define `sequence = mapM id` · c016e6f7
      David Feuer authored
      This avoids duplication in `GHC.Base`; originally, we had
        mapM f = sequence . map f
      This led to excessive allocation in `cryptarithm2`. Defining
        sequence = mapM id
      does not appear to cause any `nofib` problems.
      Reviewed By: hvr
      Differential Revision: https://phabricator.haskell.org/D470
    • David Feuer's avatar
      Make unwords and words fuse somewhat · e73ab541
      David Feuer authored
      Make `words` a good producer and `unwords` a good consumer for list
      fusion. Thus `unwords . words` will avoid producing an intermediate list
      of words, although it will produce each individual word.
      Make `unwords` slightly lazier, so that
      `unwords (s : undefined) = s ++ undefined` instead of `= undefined`.
      Reviewed By: austin
      Differential Revision: https://phabricator.haskell.org/D375
    • David Feuer's avatar
      base: Fix map/coerce comment · 413c747a
      David Feuer authored
      Make the comment on the map/coerce rule refer to the right section in
      the paper; give the full name of the papers, and name its authors.
      [skip ci]
      Differential Revision: https://phabricator.haskell.org/D472
  6. 12 Nov, 2014 2 commits
    • Simon Marlow's avatar
      Per-thread allocation counters and limits · d70b19bf
      Simon Marlow authored
      This reverts commit f0fcc41d.
      New changes: now works on 32-bit platforms too.  I added some basic
      support for 64-bit subtraction and comparison operations to the x86
    • Herbert Valerio Riedel's avatar
      Implement new integer-gmp2 from scratch (re #9281) · c774b28f
      Herbert Valerio Riedel authored
      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-` being registered in the package db.
      The previous `integer-gmp-` 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
      More information can be found via #9281 and
      Reviewed By: austin, rwbarton, simonmar
      Differential Revision: https://phabricator.haskell.org/D82
  7. 11 Nov, 2014 2 commits
    • David Feuer's avatar
      De-bias Data.Foldable and improve docstrings · e5671302
      David Feuer authored
      Use fewer left/right-biased folds for defaults and
      functions in `Data.Foldable`, to better support things
      that don't look like cons lists.
      This also extends the Haddock docstrings in `Data.Foldable`.
      Reviewed By: hvr, ekmett
      Differential Revision: https://phabricator.haskell.org/D441
    • David Feuer's avatar
      Define list monad operations using comprehensions · 4923cea5
      David Feuer authored
      Define list monad operations using list comprehensions. Code using monad
      operations with lists did not fuse fully. Writing list code with `do`
      notation or `(>>=)` and `(>>)` operations could allocate more than
      equivalent code using list comprehensions.
      Define `mapM` directly, instead of using `sequence` and `map`. This
      leads to substantially less allocation in `cryptarithm2`.
      Addresses #9781
      Reviewed By: ekmett, nomeata
      Differential Revision: https://phabricator.haskell.org/D455
  8. 10 Nov, 2014 1 commit
  9. 08 Nov, 2014 2 commits
  10. 07 Nov, 2014 5 commits
  11. 06 Nov, 2014 1 commit
  12. 05 Nov, 2014 3 commits
  13. 04 Nov, 2014 6 commits
  14. 02 Nov, 2014 2 commits
  15. 31 Oct, 2014 1 commit