Ticket #3526 (closed bug: fixed)
Inliner behaviour with instances is confusing
| Reported by: | bos | Owned by: | simonpj |
|---|---|---|---|
| Priority: | low | Milestone: | 7.2.1 |
| Component: | Compiler | Version: | 6.10.4 |
| Keywords: | Cc: | michal.terepeta@… | |
| Operating System: | Unknown/Multiple | Architecture: | Unknown/Multiple |
| Type of failure: | Runtime performance bug | Difficulty: | Unknown |
| Test Case: | Blocked By: | ||
| Blocking: | Related Tickets: |
Description
I have a fairly simple typeclass:
class Variate a where
uniform :: Gen s -> ST s a
With instances like this:
instance Variate Int8 where
uniform = f where f = uniform1 fromIntegral
{-# INLINE f #-}
uniform1 :: (Word32 -> a) -> Gen s -> ST s a
uniform1 f gen = do
i <- uniformWord32 gen
return $! f i
{-# INLINE uniform1 #-}
Notice the peculiar form of the instance definition. I had to write the above instead of the more intuitive form:
instance Variate Int8 where
uniform = uniform1 fromIntegral
{-# INLINE uniform #-}
With the more obvious form, GHC's inliner didn't fire at all for this, and I was unable to tell why. It was Duncan who suggested the more convoluted instance above. The result is about a 3x performance difference sometimes, so this has a noticeable effect.
I'm not completely sure that this is a bug, but I don't know how to describe why one form works and the other doesn't, so the compiler's behaviour is surprising to me.
Change History
Note: See
TracTickets for help on using
tickets.
