Help needed with optimization
Tom Ellis
tom-lists-haskell-cafe-2023 at jaguarpaw.co.uk
Wed Jan 24 08:21:55 UTC 2024
Thanks Simon. I'll reply on the ticket.
On Tue, Jan 23, 2024 at 10:50:15PM +0000, Simon Peyton Jones wrote:
> Ha! I could not resist having a look. See
> https://gitlab.haskell.org/ghc/ghc/-/issues/24371
>
> On Tue, 23 Jan 2024 at 21:22, Tom Ellis <tom-lists-haskell-cafe-2023 at jaguarpaw.co.uk> wrote:
>
> > I'm trying to understand why my code is not being optimized in the way
> > I would expect. I'm completely stuck and I think I need the advice of
> > an expert.
> >
> > I'm writing an effect system on top of transformers. The effect
> > system wraps monad transformers in a newtype that encodes the
> > composition structure of the transformers at the type level. Because
> > it's a newtype all of the class members are inherited directly from
> > the underlying type using coerce. When I implement something using
> > this effect system I would expect to generate exactly the same code as
> > if I had written it using transformers directly. However, it
> > generates significantly worse code, even in a very simple case.
> >
> > Firstly, a case where I do get the same code. All of these compile to
> > the constant 1. Hooray!
> >
> >
> > https://github.com/tomjaguarpaw/ad/blob/cd0d876ddb448fe611515e8768dee66dc02ed650/Eff-Optimize/Main.hs#L26-L54
> >
> > Secondly, a simple cases where I do not get the same code. `mySumMTL`
> > and `mySumNewtype` yield the same code, as expected. After all,
> > `mySumNewtype` does exactly the same thing as `mySumMTL`, it's just
> > wrapped in some newtypes. However, `mySumEff` yields worse code,
> > despite *also* being the same thing as `mySumMTL` just wrapped in some
> > newtypes.
> >
> >
> > https://github.com/tomjaguarpaw/ad/blob/cd0d876ddb448fe611515e8768dee66dc02ed650/Eff-Optimize/Main.hs#L62-L94
> >
> > You can compare the generated loops at:
> >
> >
> > https://github.com/tomjaguarpaw/ad/blob/cd0d876ddb448fe611515e8768dee66dc02ed650/Eff-Optimize/optimizer-output.md
> >
> > Does anyone have a clue what's going wrong in the optimizer here? I
> > don't think the singleton that I pass around to access the type level
> > index at runtime has anything to do with it. That seems to be
> > optimized away by inlining. Is the simplifier confused by all the
> > coercions?
> >
> > Thanks for any help anyone may be able to shed,
More information about the ghc-devs
mailing list