
You probably want specializable and specialize inline pragmas.
On Friday, June 17, 2016, Jyotirmoy Bhattacharya
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 javascript:_e(%7B%7D,'cvml','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 https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts...
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