Implement a dedicated exitfication pass #14152
authorJoachim Breitner <mail@joachim-breitner.de>
Sat, 26 Aug 2017 12:35:50 +0000 (14:35 +0200)
committerJoachim Breitner <mail@joachim-breitner.de>
Sun, 29 Oct 2017 04:00:57 +0000 (00:00 -0400)
commit0e953da147c405648356f75ee67eda044fffad49
tree7d4b5b02603048e0f68b2541423fcbc4d2aa7866
parent97ca0d249c380a961a4cb90afb44bfcee1f632f2
Implement a dedicated exitfication pass #14152

The idea is described in #14152, and can be summarized: Float the exit
path out of a joinrec, so that the simplifier can do more with it.
See the test case for a nice example.

The floating goes against what the simplifier usually does, hence we
need to be careful not inline them back.

The position of exitification in the pipeline was chosen after a small
amount of experimentation, but may need to be improved. For example,
exitification can allow rewrite rules to fire, but for that it would
have to happen before the `simpl_phases`.

Perf.haskell.org reports these nice performance wins:

    Nofib allocations
    fannkuch-redux    78446640  - 99.92%      64560
    k-nucleotide     109466384  - 91.32%    9502040
    simple            72424696  -  5.96%   68109560

    Nofib instruction counts
    fannkuch-redux  1744331636  -  3.86% 1676999519
    k-nucleotide    2318221965  -  6.30% 2172067260
    scs             1978470869  -  3.35% 1912263779
    simple           669858104  -  3.38%  647206739
    spectral-norm    186423292  -  5.37%  176411536

Differential Revision: https://phabricator.haskell.org/D3903
17 files changed:
compiler/basicTypes/Id.hs
compiler/basicTypes/Unique.hs
compiler/coreSyn/CoreLint.hs
compiler/coreSyn/CoreSyn.hs
compiler/ghc.cabal.in
compiler/main/DynFlags.hs
compiler/simplCore/CoreMonad.hs
compiler/simplCore/Exitify.hs [new file with mode: 0644]
compiler/simplCore/SimplCore.hs
compiler/simplCore/SimplUtils.hs
compiler/simplCore/Simplify.hs
docs/users_guide/using-optimisation.rst
testsuite/tests/simplCore/should_compile/T14152.hs [new file with mode: 0644]
testsuite/tests/simplCore/should_compile/T14152.stderr [new file with mode: 0644]
testsuite/tests/simplCore/should_compile/T14152a.hs [new symlink]
testsuite/tests/simplCore/should_compile/T14152a.stderr [new file with mode: 0644]
testsuite/tests/simplCore/should_compile/all.T