Specialization plugin

Ryan Trinkle ryan.trinkle at gmail.com
Mon Oct 31 00:50:45 UTC 2016


My understanding was that they ought to be the same.  However, that didn't
seem to be the case.  In my small example, where the plugin did work,
-fexpose-all-unfoldings did not.

On Sun, Oct 30, 2016 at 8:23 AM, Christiaan Baaij <
christiaan.baaij at gmail.com> wrote:

> One small question: what's the difference between adding INLINABLE
> everywhere, and just compiling with -fexpose-all-unfoldings,
> https://downloads.haskell.org/~ghc/latest/docs/html/users_
> guide/using-optimisation.html#ghc-flag--fexpose-all-unfoldings? Is there
> any reason you couldn't use that flag as opposed to writing a plugin that
> adds INLINEABLE pragmas to all bindings?
>
> On 28 October 2016 at 00:05, Ryan Trinkle <ryan.trinkle at gmail.com> wrote:
>
>> 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
>>
>> _______________________________________________
>> ghc-devs mailing list
>> ghc-devs at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
>>
>>
>
> _______________________________________________
> ghc-devs mailing list
> ghc-devs at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/ghc-devs/attachments/20161030/7f0f4bfb/attachment.html>


More information about the ghc-devs mailing list