[GHC] #8763: forM_ [1..N] does not get fused (10 times slower than go function)
GHC
ghc-devs at haskell.org
Sun Apr 27 01:56:14 UTC 2014
#8763: forM_ [1..N] does not get fused (10 times slower than go function)
--------------------------------------------+------------------------------
Reporter: nh2 | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.6.3
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
Type of failure: Runtime performance bug | Unknown/Multiple
Test Case: | Difficulty: Unknown
Blocking: | Blocked By:
| Related Tickets:
--------------------------------------------+------------------------------
Comment (by daniel.is.fischer):
Replying to [comment:8 nh2]:
> I have updated the gist at https://gist.github.com/nh2/11333427 to
contain both the matmult example (where the difference between `forM_` and
`loop` is big) and the simple example (where no difference can be
measured).
The simple example doesn't use the same list in different places, so GHC
is capable of eliminating it and giving you a loop on unboxed `Int#`s, at
least with `-O2`. In the matmult example, you need to conceal the fact
that both lists are the same from GHC to get a loop on unboxed `Int#`s.
So in principle, GHC can do the desired thing, just the sharing gets in
the way. Can somebody think of a situation where sharing is beneficial for
`forM_ [a .. b] $ \n -> do ...` code? If not, perhaps special-casing
`enumFromTo` arguments for `forM_` etc. is, at least for standard integer
types, something to be considered.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8763#comment:9>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list