
#10844: CallStack should not be inlined
-------------------------------------+-------------------------------------
Reporter: nomeata | Owner: gridaphobe
Type: task | Status: patch
Priority: normal | Milestone:
Component: Compiler | Version: 7.10.2
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s): Phab:D1259
-------------------------------------+-------------------------------------
Comment (by gridaphobe):
Ok, here's a version of Joachim's test case that doesn't involve
CallStacks.
{{{#!haskell
==> T10844a.hs <==
module T10844a where
data Foo = Foo Int String
showFoo (Foo i s) = unwords [ "Foo", show i, show s ]
foo n = showFoo $ Foo 0 "foo"
{-# INLINE foo #-}
==> T10844.hs <==
module T10844 where
import T10844a
main = print (foo 0)
}}}
With optimizations it produces the following core
{{{
% ghc --make -fforce-recomp -ddump-simpl T10844.hs -O
[1 of 2] Compiling T10844a ( T10844a.hs, T10844a.o )
==================== Tidy Core ====================
Result size of Tidy Core = {terms: 61, types: 45, coercions: 0}
T10844a.showFoo3 :: [Char]
[GblId,
Str=DmdType,
Unf=Unf{Src=<vanilla>, TopLvl=True, Value=False, ConLike=False,
WorkFree=False, Expandable=False, Guidance=IF_ARGS [] 40 0}]
T10844a.showFoo3 = GHC.CString.unpackCString# "Foo"#
T10844a.showFoo2 :: Char
[GblId,
Caf=NoCafRefs,
Str=DmdType,
Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 10 20}]
T10844a.showFoo2 = GHC.Types.C# ' '
T10844a.showFoo1 :: [Char]
[GblId,
Caf=NoCafRefs,
Str=DmdType,
Unf=Unf{Src=<vanilla>, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True, Guidance=IF_ARGS [] 10 30}]
T10844a.showFoo1 =
GHC.Types.: @ Char GHC.Show.shows6 (GHC.Types.[] @ Char)
T10844a.$wshowFoo [InlPrag=[0]] :: Int -> String -> String
[GblId,
Arity=2,
Str=DmdType ,
Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True,
Guidance=ALWAYS_IF(arity=1,unsat_ok=True,boring_ok=False)
Tmpl= \ (w_sRp [Occ=Once!] :: Foo) ->
case w_sRp
of _ [Occ=Dead] { Foo ww1_sRs [Occ=Once] ww2_sRt
[Occ=Once] ->
T10844a.$wshowFoo ww1_sRs ww2_sRt
}}]
showFoo =
\ (w_sRp :: Foo) ->
case w_sRp of _ [Occ=Dead] { Foo ww1_sRs ww2_sRt ->
T10844a.$wshowFoo ww1_sRs ww2_sRt
}
lvl_rEJ :: Int
[GblId, Caf=NoCafRefs, Str=DmdType]
lvl_rEJ = GHC.Types.I# 0
lvl1_rRU :: [Char]
[GblId, Str=DmdType]
lvl1_rRU = GHC.CString.unpackCString# "foo"#
lvl2_rRV :: String
[GblId, Str=DmdType]
lvl2_rRV = T10844a.$wshowFoo lvl_rEJ lvl1_rRU
foo [InlPrag=INLINE (sat-args=1)] :: forall t_aOn. t_aOn -> String
[GblId,
Arity=1,
Str=DmdType