#7240: Stack trace truncated too much with indirect recursion
------------------------------+---------------------------------------------
Reporter: nomeata | Owner: nomeata
Type: bug | Status: new
Priority: normal | Component: Profiling
Version: 7.4.1 | Keywords:
Os: Unknown/Multiple | Architecture: Unknown/Multiple
Failure: None/Unknown | Testcase:
Blockedby: | Blocking:
Related: |
------------------------------+---------------------------------------------
Comment(by nomeata):
In comment:1 I wondered if there are already unexpected effects when
combining the current truncation policy with the ```enterFunCCS``` logic,
and there are. Consider this program:
{{{
module Main where
import GHC.Stack
f 0 = currentCallStack >>= putStrLn . renderStack
main = boringCombinator (interestingFunction1) 0
interestingFunction1 x = interestingFunction2 x
interestingFunction2 x = case genFun x of Just g -> boringCombinator g x
boringCombinator f x = f x
genFun x = Just $ \y -> f y
}}}
With no truncating policy at all, this is the stack trace:
{{{
Stack trace:
Main.f (callstack005.hs:4:8-50)
Main.genFun (callstack005.hs:9:25-27)
Main.genFun (callstack005.hs:9:12-27)
Main.interestingFunction2 (callstack005.hs:7:31-38)
Main.boringCombinator (callstack005.hs:8:24-26)
Main.interestingFunction2 (callstack005.hs:7:53-72)
Main.interestingFunction1 (callstack005.hs:6:26-47)
Main.boringCombinator (callstack005.hs:8:24-26)
Main.main (callstack005.hs:5:8-49)
Main.CAF (<entire-module>)
}}}
Note that when, in the second invocation of ```boringCombinator```, the
thunk generated by ```genFun``` is called and ```interestingFunction1```
is on both the stack of the call site and the function (part of the common
prefix), so it is not appended to the stack. But with the current output,
the result is
{{{
Stack trace:
Main.f (callstack005.hs:4:8-50)
Main.genFun (callstack005.hs:9:25-27)
Main.genFun (callstack005.hs:9:12-27)
Main.interestingFunction2 (callstack005.hs:7:31-38)
Main.interestingFunction1 (callstack005.hs:6:26-47)
Main.boringCombinator (callstack005.hs:8:24-26)
Main.main (callstack005.hs:5:8-49)
Main.CAF (<entire-module>)
}}}
Here, ```interestingFunction1``` was truncated from the stack between the
first and the second invocation of ```boringCombinator```. But it still
lies on the stack of the thunk, so it is appended after the second
invocation of ```boringCombinator```, suddenly reversing the order of
things on the stack.
So I conclude that both policies, the one in place and the one I am
suggesting, do not behave perfectly WRT to the stack merging. (Ideally, a
stack truncating function should commute with ```++>```, but it is not
clear to me if that is even possible without storing the whole stack).
That leads us to the question what policy is more desired. I would argue
that the current policy truncates too much, i.e. in the example in
comment:3, the interesting functions would neither show up in the stack
trace nor get cost allocated for ```f```.
What effects would my policy have on the profiles? It would be more
accurate about the now truncated functions: Because it only truncates
duplicate segments, any function that is on the stack without any
truncation will be on the stack with my policy.
OTOH functions who appear several times will inherit the cost several
times (```inheritCosts``` in Profiling.c). Is that acceptable? Maybe even
desirable? ```inheritCosts``` does not seem to be time-critical, so one
could add code that only adds the current cc’s values to the ccs if this
cc is not already present on the ccs above (and hence was already
counted).
If that is algorithmically to slow we can use the information in
```pushCostCentre``` (where we already have it, due to ```checkLoop```)
and save it in the ccs via ```actualPush```.
Ok, enough analysis for now; I should now wait for feedback.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/7240#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs