You probably want specializable and specialize inline pragmas.
On Friday, June 17, 2016, Jyotirmoy Bhattacharya <jyotirmoy@jyotirmoy.net> wrote:Sorry, realized that attachments cannot be sent to the list. I have put the code on GitHub here https://github.com/jmoy/testing-specializeOn Fri, Jun 17, 2016 at 4:31 PM, Jyotirmoy Bhattacharya <jyotirmoy@jyotirmoy.net> wrote:Jyotirmoy BhattacharyaRegards,Marking the function as INLINE might solve the problem but that's something I don't want to do as it seems to me that specialization and not inlining is what's appropriate here.I'm using GHC 8.0.1 with the -O2 flag.I am writing to this list rather than filing a bug since I'm not sure if I'm reading the manual right and I have not explicitly verified that the specialization is not happening. I would greatly appreciate any help on both counts.I'm trying to write a mutable hash table library that would work both in the IO and ST monads, so I'm using the PrimMonad typeclass [see JmoyHash.hs in the attached archive].For efficiency, I would like the functions to be specialized to the concrete monad at the call site. According to Section 9.31.9.2 of the GHC User's GuideThe optimiser also considers each imported INLINABLE overloaded function, and specialises it for the different types at which it is called in M.So I marked all the functions in my library as INLINABLE. Yet adding a SPECIALIZE pragma in Main.hs (currently commented out) for an imported function improves runtime performance by 3x, which should not be happening since, if I understand the manual right, the function should have been specialized anyway since it is marked INLINABLE.