
#11677: Dramatic de-optimization with "-O", "-O1", "-O2" options -------------------------------------+------------------------------------- Reporter: malphunction | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.3 Resolution: | Keywords: optimization | deoptimization Operating System: Linux | Architecture: x86_64 Type of failure: Runtime | (amd64) performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Comment (by simonpj): This is another in the long chain of tickets involving the "state hack" and `replicateM`. See #1168 for a list and #9388 for ideas. Sadly `-fno-state-hack` doesn't make any difference. Reason: the `fmap` for `IO` is begin called, and looks like {{{ fmapIO = \f a s. case a s of (r, s') -> (f r, s') }}} So if we have `replicateM (fmapIO (g (expensive x)) getLine)`, we'll inline `fmapIO` to {{{ replicateM (let f = g (expensive x) in \s. case getLine s of (r, s') -> (f r, s')) }}} Now if that `\s` which come from `fmapIO` is treated as one-shot, we'll inline `g (expensive x)` inside; disaster. The `-fno-state-hack` doesn't make any difference because Joachim arranged to persist one-shot-ness in interface files, so what matters is the setting in `GHC.Base` where `fmapIO` was defined. Anyway that's the reason, and we have many examples of it. The right solution is sketched in #9388 but it needs someone to pick up the cudgels. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11677#comment:6 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler