
#10992: Performance regression due to lack of inlining of `foldl` and `foldl'`. ---------------------------------+-------------------------------------- Reporter: aleator | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.2 Resolution: | Keywords: performane Operating System: Linux | Architecture: x86_64 (amd64) Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | ---------------------------------+-------------------------------------- Comment (by nomeata): I looked into this, and the cause is clear: In 7.10, `foldl (+) 0` (which is how `GHC.List.sum` is defined) resp. `foldl' (+) 0` are not inlined here. If they were, GHC would be able to transform both to the ideal code corresponding to an explicit recursion with accumulator. If I use these definitions: {{{ sum0 xs = sum xs sum3 xs = foldl' (+) 0 xs sum5 xs = foldl (+) 0 xs }}} then I get good code in all cases. The reason is that `foldl` is set up so that it inlines once the third argument is present: {{{ {-# INLINE foldl #-} foldl k z0 xs = ... {-# INLINE foldl' #-} foldl' k z0 xs = }}} This makes sense when trying to achieve list fusion, but even with two arguments (or maybe even one), inlining would be useful for the strictness analyzer to fire. I’m however not sure how relevant unsaturated calls to `foldl` are in practice. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10992#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler