Specialization plugin

Ryan Trinkle ryan.trinkle at gmail.com
Thu Oct 27 23:05:31 UTC 2016


Hi everyone,

I'm trying my hand at writing a GHC plugin to generate specializations for
all uses of a particular typeclass, and I've run into some trouble.  I'd
appreciate it if someone could point me in the right direction!  I'm new to
GHC development, so I may just be overlooking some simple stuff.

The original problem:
Reflex's interface is presented as a typeclass, which allows the underlying
FRP engine to be selected by instance resolution.  Although some programs
make use of this (particularly the semantics test suite), most only ever
use one implementation.  However, since their code is typically written
polymorphically, the implementation cannot be inlined and its rewrite rules
cannot fire.  This means that the typeclass

My attempted solutions:
 * Initially, I wrote a plugin that adds INLINABLE pragmas to everything.
This helped; small programs now generally see the inlining/rule-firings I
was hoping for.  However, in large programs, this does not occur.  I'm
looking into this, but also trying another approach:
 * Now, I am attempting to write a plugin that adds a SPECIALIZE pragma to
every binding whose type mentions Reflex.

The trouble:
Since SPECIALIZE pragmas seem to be removed during typechecking
(DsBinds.dsSpec), I can't directly add them.  I would like to, perhaps,
invoke Specialise.specBind; however, I'm not sure how to obtain the
necessary instance - as mentioned here
<https://github.com/ghc/ghc/blob/c36904d66f30d4386a231ce365a056962a881767/compiler/specialise/Specialise.hs#L288>,
"only the type checker can conjure [dictionaries] up".  Perhaps it's
possible to explicitly create that dictionary somewhere and extract it for
use during the plugin pass?


Thanks,
Ryan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20161027/e8bd9759/attachment-0001.html>


More information about the ghc-devs mailing list