Hi Christiaan,

Wow, the whole OPAQUE pragma proposal and implementation completely slipped my attention.
I left a comment on the proposal about GHC.Exts.{lazy,noinline}.

Regarding the reboxing problem: You might want to wait for !5790, which represents boxity explicitly in the demand lattice, allowing you to get rid of all boxity info in the demand signature of an OPAQUE function around the call to `mkDmdTypeForArity`.
In the meantime, your best bet is to get rid of any strict product demands in the demand signature, which at the moment says "unbox this thing, because it is used unboxed".

Either way, you shouldn't even need to touch WW if you simply degrade the (demand and CPR) signatures in that way, and it's more compositional, too, because the analysis is able to propagate the "don't unbox" info to callers, whereas it's too late to have non-local impact on callers of the OPAQUE function when WW runs.

I enabled notifications for !5562, so feel free to continue the discussion there.

Sebastian

Am Do., 24. Juni 2021 um 11:57 Uhr schrieb Christiaan Baaij <christiaan.baaij@gmail.com>:
Hi Ghc-Devs,

I believe I've mostly finished the implementation of GHC proposal 0415 [1], the OPAQUE pragma, over at: https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5562

The only remaining issue is that I'm unsure whether there's a way to prevent reboxing of worker arguments as witnessed here: https://gitlab.haskell.org/ghc/ghc/-/merge_requests/5562/diffs#29ad02619a9f318d67c6cd19648917dbb17354e9_0_134

Note that the reboxing doesn't happen in the worker of the OPAQUE-annotated bindings, because OPAQUE-annotated bindings aren't W/W-transformed, but in a worker of a function that calls the OPAQUE-annotated binding.
This reboxing was the reason behind the descision to W/W transform NOINLINE-annotated bindings in: https://gitlab.haskell.org/ghc/ghc/-/commit/b572aadb20c2e41e2f6d7b48401bd0b4239ce9f8

But the whole idea behind OPAQUE is not to change calls to the annotated binding f by some call of a name-mangled version of f; so W/W transforming OPAQUE-annoted binders is not an option.

Any hints on how to avoid the reboxing (if possible) would be appreciated, like:
* Do I need to change something in GHC.Core.Opt.WorkWrap? or
* Do I need to change the demand/strictness signature of OPAQUE-annoted bindings?
* or something else?

Thanks,

Christiaan

[1] https://github.com/ghc-proposals/ghc-proposals/blob/master/proposals/0415-opaque-pragma.rst
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs