This is an example of how information is lost as a result of trunction of the cost centre stack. The actual call graph is of this program is: main -> f 1 -> g 2 -> f 3 -> h 1 But with pushing "f" a second time the "g" label is also lost. Additionally the h-statement is associated with the stack [f], which can either be from the untruncated f statement or the truncated f statement. We therefore infer the following call graph: main -> f 1 -> {f 3, g 2} -> h 1 \_________________^ > {-# LANGUAGE TemplateHaskell, Rank2Types #-} > import Debug.Hoed.Stk > $(observedTypes "f" []) > $(observedTypes "g" []) > $(observedTypes "h" []) > f :: Int -> Int > f x = $(observeTempl "f") f' x > f' x = {-# SCC "f" #-} f'' x > f'' 1 = g 2 > f'' x = h (x + 1) > g :: Int -> Int > g x = $(observeTempl "g") g' x > g' x = {-# SCC "g" #-} g'' x > g'' x = f (x + 1) > h :: Int -> Int > h x = $(observeTempl "h") h' x > h' x = {-# SCC "h" #-} h'' x > h'' x = (x+1) > main = logO "hoed-tests-Stk-IndirectRecursion.graph" $ print (f 1)