[GHC] #13422: INLINE CONLIKE sometimes fails to inline
GHC
ghc-devs at haskell.org
Tue Apr 4 14:20:30 UTC 2017
#13422: INLINE CONLIKE sometimes fails to inline
-------------------------------------+-------------------------------------
Reporter: dfeuer | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone: 8.4.1
Component: Compiler | Version: 8.1
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
Type of failure: Runtime | Unknown/Multiple
performance bug | Test Case:
Blocked By: | Blocking:
Related Tickets: #7206 | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by simonpj):
Here's the reason. We get
{{{
let xs = case n of I# n1 -> cheapBuild blah
in ...(foldr k z xs)...(foldr k2 z2 xs)...
}}}
So the `cheapBuild` is hidden behind that `case n` and the
`foldr/cheapBuild` rule does not fire.
The problem comes from
{{{
instance Enum Int where
...
enumFromTo (I# x) (I# y) = eftInt x y
}}}
So `[1..n]` desugars into `(case n of I# n' -> eftInt 1# n')`. This
doesn't hurt normal foldr/build because if we see
{{{
foldr k z (case n of I# n' -> build blah)
}}}
we know that `foldr` is strict and so float the case outwards. This
doesn't happen with the `cheapBuild` stuff since the producer and consumer
are further apart.
But the solution is, I think, easy: move the evaluation of n into
`eftInt`. So we have
{{{
instance Enum Int where
...
enumFromTo x y = eftInt x y
}}}
Now `eftInt` takes boxed `Ints` but it can evaluate them just fine.
I've pushed a patch to `wip/cheap-build`, and it works just fine.
'''However''':
* It needs a serious note (steal the text above)
* Other uses of `cheapBuild` need similar treatment.
So the commit needs work.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13422#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list