
#7206: Implement cheap build -------------------------------------+------------------------------------- Reporter: simonpj | Owner: simonpj Type: bug | Status: new Priority: normal | Milestone: ⊥ Component: Compiler | Version: 7.4.2 Resolution: | Keywords: FloatOut Operating System: Unknown/Multiple | Architecture: Type of failure: Runtime | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: #8763, #13422 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by osa1): I rebased the `cheap-build` branch, applied the idea in #13422 to `Word` and `Char` enumerations (`Int` was already implemented), verified that it works as expected, and run nofib again. The result is the same; only allocation difference is in `cacheprof`. Runtimes differ, but when I compared STG outputs I see that they're identical even though runtime differs a few percent. So they're really just noise. I suspect runtime results in comment:13 are also of this nature. I was thinking that this optimization can be done with little user intervention by adding an `INLINE` pragma, but surprisingly it doesn't work. In the example from #13422: {{{ foo :: Int -> Int foo n = s + p where nums = [1..n] s = sum nums p = product nums }}} adding `INLINE` to nums (in original GHC, without `cheap-build` patch) does not make it fuse. However if I manually inline it (substitute `[1..n]` for `nums`) it fuses as expected. Not sure if this is a bug or not, but it's certainly surprising to me. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/7206#comment:24 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler