#14790: eqTypeRep does not inline -------------------------------------+------------------------------------- Reporter: dfeuer | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: 8.6.1 Component: Compiler | Version: 8.4.1-alpha2 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Runtime | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by mpickering): I looked at the interface file for `Data.Typeable.Internal` where `eqTypeRep` is defined. Here is the unfolding for `eqTypeRep`. {{{ 855825a70951c01dfa45bc3067373660 eqTypeRep :: forall k1 k2 (a :: k1) (b :: k2). TypeRep a -> TypeRep b -> Maybe (a :~~: b) {- Arity: 2, Strictness: <S,1*U><S,1*U>, Unfolding: (\ @ k1 @ k2 @ a :: k1 @ b :: k2 (a1 :: TypeRep a) (b1 :: TypeRep b) -> let { $j :: Word# -> Word# -> Maybe (a :~~: b) <join 2> {- Arity: 2, Strictness: <S,U><L,U> -} = \ (dt :: Word#)[OneShot] (dt1 :: Word#)[OneShot] -> case b1 of wild { TrType co co1 -> case fpTYPELiftedRep of wild1 { Fingerprint dt2 dt3 -> case eqWord# dt dt2 of lwild { DEFAULT -> Nothing @ (a :~~: b) 1# -> case eqWord# dt1 dt3 of lwild1 { DEFAULT -> Nothing @ (a :~~: b) 1# -> eqTypeRep1 @ k1 @ a @ k2 @ b } } } TrTyCon dt2 dt3 ds ds1 ds2 -> case eqWord# dt dt2 of lwild { DEFAULT -> Nothing @ (a :~~: b) 1# -> case eqWord# dt1 dt3 of lwild1 { DEFAULT -> Nothing @ (a :~~: b) 1# -> eqTypeRep1 @ k1 @ a @ k2 @ b } } TrApp k4 a2 b2 co dt2 dt3 ds ds1 ds2 -> case eqWord# dt dt2 of lwild { DEFAULT -> Nothing @ (a :~~: b) 1# -> case eqWord# dt1 dt3 of lwild1 { DEFAULT -> Nothing @ (a :~~: b) 1# -> eqTypeRep1 @ k1 @ a @ k2 @ b } } TrFun r1 r2 a2 b2 co co1 dt2 dt3 ds ds1 -> case eqWord# dt dt2 of lwild { DEFAULT -> Nothing @ (a :~~: b) 1# -> case eqWord# dt1 dt3 of lwild1 { DEFAULT -> Nothing @ (a :~~: b) 1# -> eqTypeRep1 @ k1 @ a @ k2 @ b } } } } in case a1 of wild { TrType co co1 -> case fpTYPELiftedRep of wild1 { Fingerprint dt dt1 -> $j dt dt1 } TrTyCon dt dt1 ds ds1 ds2 -> $j dt dt1 TrApp k4 a2 b2 co dt dt1 ds ds1 ds2 -> $j dt dt1 TrFun r1 r2 a2 b2 co co1 dt dt1 ds ds1 -> $j dt dt1 }) -} }}} It appears that both functions I mentioned above are inlined (to no great effect) which make the definition quite large. -- Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14790#comment:8> GHC <http://www.haskell.org/ghc/> The Glasgow Haskell Compiler