Sorry, realized that attachments cannot be sent to the list. I have put the code on GitHub here https://github.com/jmoy/testing-specialize

On Fri, Jun 17, 2016 at 4:31 PM, Jyotirmoy Bhattacharya <jyotirmoy@jyotirmoy.net> wrote:
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 Guide

The 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.

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 using GHC 8.0.1 with the -O2 flag.

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.

Regards,
Jyotirmoy Bhattacharya