*   To access an unfolding, is `maybeUnfoldingTemplate (idUnfolding v)` the 
recommended recipe?
You can see by looking at the code that idUnfolding returns nothing for a loop 
breaker.  You have to decide if that’s what you want; if not, use 
realIdUnfolding.

*   Is it the case that this recipe succeeds (`Just`) in some compiler phases 
and not others?
It fails for loop breakers.  An Id might be a loop breaker in some phases but 
not others; e.g. the loop might be broken by some optimisation.

*   Before an Id is ready for general inlining by the simplifier, can I get the 
Id's unfolding another way so that I can substitute it early?

realIdUnfolding always works.  As the code shows


idUnfolding :: Id -> Unfolding

-- Do not expose the unfolding of a loop breaker!

idUnfolding id

  | isStrongLoopBreaker (occInfo info) = NoUnfolding

  | otherwise                          = unfoldingInfo info

  where

    info = idInfo id



realIdUnfolding :: Id -> Unfolding

-- Expose the unfolding if there is one, including for loop breakers

realIdUnfolding id = unfoldingInfo (idInfo id)


Does that help?

Simon


From: [email protected] [mailto:[email protected]] On Behalf Of 
Conal Elliott
Sent: 02 December 2016 18:13
To: Simon Peyton Jones <[email protected]>
Cc: [email protected]
Subject: Re: How to inline early in a GHC plugin?

Thanks for the pointers, Simon. Some more specific questions:

*   To access an unfolding, is `maybeUnfoldingTemplate (idUnfolding v)` the 
recommended recipe?
*   Is it the case that this recipe succeeds (`Just`) in some compiler phases 
and not others?
    If so, is this difference due to Ids being altered (presumably via 
`setUnfoldingInfo` being called between phases)?
*   Before an Id is ready for general inlining by the simplifier, can I get the 
Id's unfolding another way so that I can substitute it early?

A short Skype chat might easily clear up my questions and confusions if you 
have time and inclination.

Regards, - Conal

On Fri, Dec 2, 2016 at 9:07 AM, Simon Peyton Jones 
<[email protected]<mailto:[email protected]>> wrote:
I don’t really understand your question clearly.  So I’ll guess

Unfoldings are added to Ids in Simplify.completeBind (look for 
setUnfoldingInfo).  Apart from INLINE pragmas, that’s about the only place it 
happens.

Does that help?

S

From: ghc-devs 
[mailto:[email protected]<mailto:[email protected]>] On 
Behalf Of Conal Elliott
Sent: 01 December 2016 21:51
To: [email protected]<mailto:[email protected]>
Subject: How to inline early in a GHC plugin?

I'm implementing a GHC plugin that installs a `BuiltInRule` that does the work, 
and I'd like to learn how to inline more flexibly. Given an identifier `v`, I'm 
using `maybeUnfoldingTemplate (realIdUnfolding v)` to get a `Maybe CoreExpr`. 
Sometimes this recipe yields `Nothing` until a later compiler phase. Meanwhile, 
I guess my variable `v` has been replaced by one with inlining info. First, am 
I understanding this mechanism correctly? A GHC source pointer to how inlining 
is made available would help me. Second, can I access the inlining info before 
it's made available to the rest of the simplifier?

Thanks,  - Conal

_______________________________________________
ghc-devs mailing list
[email protected]
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to