#2420: Multi-method classes are inlined/specialized better than single-method
classes for strict types
--------------------------+-------------------------------------------------
Reporter: sedillard | Owner:
Type: bug | Status: new
Priority: normal | Component: Compiler
Version: 6.8.3 | Severity: normal
Keywords: | Testcase:
Architecture: Unknown | Os: Linux
--------------------------+-------------------------------------------------
Instances of single-method class are optimized better than instances of
multi-method classes. Attached is a small example,
{{{
class Square a where
square :: a -> a
}}}
and a simple data type
{{{
data Pair a = Pair !a !a
instance Num a => Square (Pair a) where
square (Pair a b) = Pair (a*a) (b*b)
}}}
and a specialized function
{{{
squarepd :: Pair Double -> Pair Double
squarepd = pair
}}}
Compiled as is, squarepd will turn into this
{{{
Test.squarepd :: Test.Pair GHC.Float.Double -> Test.Pair GHC.Float.Double
[GlobalId]
[Arity 1
NoCafRefs
Str: DmdType U(U(L)U(L))m]
Test.squarepd =
\ (eta_sgh :: Test.Pair GHC.Float.Double) ->
case eta_sgh of wild_B1 { Test.Pair a_a60 b_a61 ->
case a_a60 of wild1_agE { GHC.Float.D# x_agG ->
case b_a61 of wild2_Xh2 { GHC.Float.D# x1_Xh7 ->
Test.Pair
@ GHC.Float.Double
(GHC.Float.D# (GHC.Prim.*## x_agG x_agG))
(GHC.Float.D# (GHC.Prim.*## x1_Xh7 x1_Xh7))
}}}
}}}
Now if you add another method to class Square (anything at all), this
happens
{{{
Test.squarepd :: Test.Pair GHC.Float.Double -> Test.Pair GHC.Float.Double
[GlobalId]
[Arity 1
NoCafRefs
Str: DmdType U(U(L)U(L))m]
Test.squarepd =
__inline_me (\ (ds_dgv :: Test.Pair GHC.Float.Double) ->
case ds_dgv of wild_Xi { Test.Pair a_a5Y b_a5Z ->
Test.$WPair
@ GHC.Float.Double
(GHC.Float.timesDouble a_a5Y a_a5Y)
(GHC.Float.timesDouble b_a5Z b_a5Z)
})
}}}
Which also what you get when you remove the strictness annotations from
'Pair'.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/2420>
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