id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	os	architecture	failure	difficulty	testcase	blockedby	blocking	related
5298	Inlined functions aren't fully specialised	reinerp		"When a function is inlined, it can expose other functions as candidates for specialisation, but GHC doesn't specialise them.

For instance, given the two modules

{{{
module A where

{-# INLINABLE fac #-}
fac :: Num a => a -> a
fac 0 = 1
fac n = n * fac (n-1)

{-# INLINE f #-}
f :: Num a => a -> a
f a = fac a
}}}


{{{
module B where

import A

g :: Int -> Int
g x = f x
}}}

we see that f is inlined, but fac isn't specialised for Ints:

{{{
B.g :: Int -> Int
[GblId,
 Arity=1,

 Unf=Unf{Src=<vanilla>, TopLvl=True, Arity=1, Value=True,
         ConLike=True, Cheap=True, Expandable=True,
         Guidance=IF_ARGS [0] 30 0}]
B.g =
  \ (x_ary :: Int) ->
    A.fac @ Int $fNumInt x_ary
}}}

Removing the INLINE pragma on f doesn't help.

Either of the following changes will cause fac to be specialised:

 * adding {-# SPECIALISE f :: Int -> Int #-} to module B
 * defining ""g x = fac x"" instead

This happens with both GHC 7.0.3 and GHC HEAD"	bug	new	low	7.6.2	Compiler	7.0.3			hackage.haskell.org@… pho@… jpm@…	Unknown/Multiple	Unknown/Multiple	Runtime performance bug					
