Oh well, your INLINE pragma is saying "please inline evtRead at every call site". And so GHC does exactly that.
That seems like obeying the pragma doesn't it? Simon | -----Original Message----- | From: Gabor Greif <[email protected]> | Sent: 08 January 2019 00:06 | To: Simon Peyton Jones <[email protected]> | Cc: ghc-devs <[email protected]> | Subject: Re: [Q] Inlining done: evtRead | | I think you have to follow this: | | -- | Data is available to be read. | evtRead :: Event | evtRead = Event 1 | {-# INLINE evtRead #-} | | | On 1/8/19, Simon Peyton Jones <[email protected]> wrote: | > Are you sure? GHC.Event isn't used on Windows, so I did this: | > | > ================= | > module Bar where | > | > newtype Evt = Evt Int | > | > evtRead :: Evt | > evtRead = Evt 33 | > | > instance Show Evt where | > show = showEvt | > | > showEvt :: Evt -> String | > {-# NOINLINE showEvt #-} | > showEvt (Evt x) = show x | > ============ | > | > module Foo where | > | > import Bar | > | > main = print evtRead | > =============== | > | > And indeed when I compile these with -O I get | > | > Foo.main1 | > = showEvt (Bar.evtRead1 `cast` (Sym (Bar.N:Evt[0]) :: Int ~R# Evt)) | > | > where Bar.evtRead1 is the static (I# 33) box. | > | > No duplication. | > | > Can you give me a repro case that isn't OS-specific? (I suppose I can | try | > on Linux tomorrow, but I'm sure that the OS is only accidentally involved | > here.) | > | > Simon | > | > | -----Original Message----- | > | From: Gabor Greif <[email protected]> | > | Sent: 07 January 2019 23:28 | > | To: Simon Peyton Jones <[email protected]> | > | Cc: ghc-devs <[email protected]> | > | Subject: [Q] Inlining done: evtRead | > | | > | Hi Simon, | > | | > | a simplifier question... | > | | > | Roughly a year ago I started learning about imported Ids, their | > unfoldings | > | etc. | > | | > | I have very small example program that compiles on Linux. | > | | > | ```haskell | > | import GHC.Event | > | | > | main = print evtRead | > | ``` | > | | > | `evtRead` is a newtype-wrapped Int. When you compile above program | > | with HEAD GHC without optimisation, you'll see that `evtRead` gets | > | passed directly to `show`. | > | | > | But with -O1 it's unfolding will be inlined, floated to toplevel, and | > | dumped as static global data into the using Main module. This was not | > | the case in GHC 8.4. Not sure about 8.6 (will check). Anyway here is | > | the inlining notice that the simplifier gave me (-ddump-inlinings | > | -dverbose-core2core) | > | | > | > Inlining done: GHC.Event.Internal.evtRead | > | > Inlined fn: (GHC.Types.I# 1#) | > | > `cast` (Sym (GHC.Event.Internal.N:Event[0]) | > | > :: GHC.Types.Coercible GHC.Types.Int | > | > GHC.Event.Internal.Event) | > | > Cont: Stop[BoringCtxt] GHC.Event.Internal.Event | > | > | > | | > | I believe this is a regression, as copies of global data can pop up in | > | potentially many different modules. | > | | > | What do you think? Which change could have caused this? | > | | > | Cheers, | > | | > | Gabor | > _______________________________________________ ghc-devs mailing list [email protected] http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
