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 |