Hi Roman,<br><br>Thanks for the suggestion, but that doesn't seem to change things.<br><br><br>Cheers,<br>Pedro<br><br><div class="gmail_quote">2011/1/19 Roman Leshchinskiy <span dir="ltr"><<a href="mailto:rl@cse.unsw.edu.au">rl@cse.unsw.edu.au</a>></span><br>
<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;"><div bgcolor="#FFFFFF"><div>Have you tried adding another (dummy) method to the class? GHC used to have problems with optimising single-method classes in the past.</div>
<div><br></div><div>Roman<div><div></div><div class="h5"><br><br>On 18 Jan 2011, at 10:33, José Pedro Magalhães <<a href="mailto:jpm@cs.uu.nl" target="_blank">jpm@cs.uu.nl</a>> wrote:<br><br></div></div></div><div><div>
</div><div class="h5"><div></div><blockquote type="cite"><div>Hello all,<br><br>I fail to understand the behavior of the inliner in the following example:<br><br><blockquote style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex; font-family: courier new,monospace;" class="gmail_quote">
module M1 where<br><br>class MyEnum a where myEnum :: [a]<br><br>instance MyEnum () where myEnum = [()]<br></blockquote><div> </div><blockquote style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex; font-family: courier new,monospace;" class="gmail_quote">
module M2 where<br><br>import M1<br><br>f1 = map (\() -> 'p') [()]<br>f2 = map (\() -> 'q') myEnum<br></blockquote><br>The generated core code for M2 with ghc-7.0.1 -O is:<br><br><blockquote style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex; font-family: courier new,monospace;" class="gmail_quote">
M2.f22 :: GHC.Types.Char<br>[GblId,<br> Caf=NoCafRefs,<br> Str=DmdType m,<br> Unf=Unf{Src=<vanilla>, TopLvl=True, Arity=0, Value=True,<br> ConLike=True, Cheap=True, Expandable=True,<br> Guidance=IF_ARGS [] 1 2}]<br>
M2.f22 = GHC.Types.C# 'q'<br><br>M2.f11 :: GHC.Types.Char<br>[GblId,<br> Caf=NoCafRefs,<br> Str=DmdType m,<br> Unf=Unf{Src=<vanilla>, TopLvl=True, Arity=0, Value=True,<br> ConLike=True, Cheap=True, Expandable=True,<br>
Guidance=IF_ARGS [] 1 2}]<br>M2.f11 = GHC.Types.C# 'p'<br><br>M2.f21 :: () -> GHC.Types.Char<br>[GblId,<br> Arity=1,<br> Caf=NoCafRefs,<br> Unf=Unf{Src=<vanilla>, TopLvl=True, Arity=1, Value=True,<br>
ConLike=True, Cheap=True, Expandable=True,<br> Guidance=ALWAYS_IF(unsat_ok=True,boring_ok=True)}]<br>M2.f21 =<br> \ (ds_dch :: ()) -> case ds_dch of _ { () -> M2.f22 }<br><br>M2.f2 :: [GHC.Types.Char]<br>
[GblId,<br> Str=DmdType,<br> Unf=Unf{Src=<vanilla>, TopLvl=True, Arity=0, Value=False,<br> ConLike=False, Cheap=False, Expandable=False,<br> Guidance=IF_ARGS [] 3 0}]<br>M2.f2 =<br> GHC.Base.map<br>
@ () @ GHC.Types.Char M2.f21 M1.$fMyEnum()_$cmyEnum<br><br>M2.f1 :: [GHC.Types.Char]<br>[GblId,<br> Caf=NoCafRefs,<br> Str=DmdType,<br> Unf=Unf{Src=<vanilla>, TopLvl=True, Arity=0, Value=True,<br> ConLike=True, Cheap=True, Expandable=True,<br>
Guidance=IF_ARGS [] 1 3}]<br>M2.f1 =<br> GHC.Types.:<br> @ GHC.Types.Char M2.f11 (GHC.Types.[] @ GHC.Types.Char)<br></blockquote><br>So, why does the inliner fail to get rid of the map in f2, while correctly ditching it in f1? Note that using two modules is essential here: if the instance is in M2 (and thus becoming orphan), the inliner works "correctly". Adding INLINE/INLINABLE pragmas to myEnum doesn't improve things either. Is this a bug, or is there a reason for this behavior?<br>
<br><br>Thanks,<br>Pedro<br>
</div></blockquote></div></div><blockquote type="cite"><div><span>_______________________________________________</span><br><span>Glasgow-haskell-users mailing list</span><br><span><a href="mailto:Glasgow-haskell-users@haskell.org" target="_blank">Glasgow-haskell-users@haskell.org</a></span><br>
<span><a href="http://www.haskell.org/mailman/listinfo/glasgow-haskell-users" target="_blank">http://www.haskell.org/mailman/listinfo/glasgow-haskell-users</a></span><br></div></blockquote></div></blockquote></div><br>