Fix cost-centre-stacks bug (#5654)
authorSimon Marlow <marlowsd@gmail.com>
Thu, 15 Dec 2016 16:17:19 +0000 (11:17 -0500)
committerBen Gamari <ben@smart-cactus.org>
Thu, 15 Dec 2016 16:17:29 +0000 (11:17 -0500)
commit394231b301efb6b56654b0a480ab794fe3b7e4db
treeaae8fd1ee76ed8a06b9c87beb5dd2cb1aa8187e7
parent5c76f834b5b7f2ee9712d0888a8b1b186b77dee5
Fix cost-centre-stacks bug (#5654)

This fixes some cases of wrong stacks being generated by the profiler.
For background and details on the fix see
`Note [Evaluating functions with profiling]` in `rts/Apply.cmm`.

This does have an impact on allocations for some programs when
profiling.  nofib results:

```
   k-nucleotide          +0.0%     +8.8%    +11.0%    +11.0%      0.0%
         puzzle          +0.0%    +12.5%     0.244     0.246      0.0%
      typecheck           0.0%     +8.7%    +16.1%    +16.2%      0.0%
------------------------------------------------------------------------
--------
            Min          -0.0%     -0.0%    -34.4%    -35.5%    -25.0%
            Max          +0.0%    +12.5%    +48.9%    +49.4%    +10.6%
 Geometric Mean          +0.0%     +0.6%     +2.0%     +1.8%     -0.3%

```

But runtimes don't seem to be affected much, and the examples I looked
at were completely legitimate.  For example, in puzzle we have this:

```
position :: ItemType -> StateType ->  BankType
position Bono = bonoPos
position Edge = edgePos
position Larry = larryPos
position Adam = adamPos
```

where the identifiers on the rhs are all record selectors.  Previously
the profiler gave a stack that looked like

```
  position
  bonoPos
  ...
```

i.e. `bonoPos` was at the same level of the call stack as `position`,
but now it looks like

```
  position
   bonoPos
   ...
```

I used the normaliser from the testsuite to diff the profiling output
from other nofib programs and they all looked better.

Test Plan:
* the broken test passes
* validate
* compiled and ran all of nofib, measured perf, diff'd several .prof
files

Reviewers: niteria, erikd, austin, scpmw, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D2804

GHC Trac Issues: #5654, #10007
compiler/codeGen/StgCmmClosure.hs
includes/Cmm.h
rts/Apply.cmm
testsuite/tests/profiling/should_run/T5654-O0.hs [moved from testsuite/tests/profiling/should_run/T5654.hs with 100% similarity]
testsuite/tests/profiling/should_run/T5654-O0.prof.sample [new file with mode: 0644]
testsuite/tests/profiling/should_run/T5654-O1.hs [new file with mode: 0644]
testsuite/tests/profiling/should_run/T5654-O1.prof.sample [new file with mode: 0644]
testsuite/tests/profiling/should_run/T5654.prof.sample [deleted file]
testsuite/tests/profiling/should_run/T680.prof.sample
testsuite/tests/profiling/should_run/all.T