Profiling semantics bug
GHC doesn't quite implement the new cost-centre stack semantics correctly. e.g.
{-# NOINLINE f #-}
f :: Int -> Int
f = {-# SCC f #-} g
{-# NOINLINE g #-}
g :: Int -> Int
g x = {-# SCC g #-} x + 1
main = print (f 3)
What we want is
CAF Main 106 0 0.0 0.7 0.0 21.7
f Main 201 1 0.0 0.0 0.0 0.0
main Main 200 1 0.0 20.9 0.0 21.0
f Main 202 0 0.0 0.0 0.0 0.1
g Main 203 1 0.0 0.1 0.0 0.1
but we get
CAF Main 106 0 0.0 0.7 0.0 21.6
f Main 201 1 0.0 0.0 0.0 0.0
main Main 200 1 0.0 20.9 0.0 20.9
g Main 202 1 0.0 0.0 0.0 0.0
The original flat CC profiler used to use IND_PERM indirections to handle this kind of thing, but we aren't doing that now.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.2.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Profiling |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | |
| Architecture |