#10528: compile time performance regression with OverloadedStrings and Text -------------------------------------+------------------------------------- Reporter: jakewheat | Owner: Type: bug | Status: merge Priority: high | Milestone: 7.10.3 Component: Compiler | Version: 7.10.2-rc2 Resolution: | Keywords: Operating System: Linux | Architecture: Type of failure: Compile-time | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by simonpj): Replying to [comment:34 afarmer]:
I realize I could be careful about assigning phases to the inline pragma on `baz` and both rules, but that seems extremely fiddly compared to just not inlining/rewriting the RHS to begin with.
It may be fiddly but you absolutely must do it. In the rewrite sequence you give, the inlining for `baz` is active, so GHC could perfectly well rewrite {{{ bar (baz (quux z)) ---> bar (<baz's inlining with (quux z) substituted>) }}} What makes you think that rule "baz-quux" will get there first? Even if it usually does, some trivial thing might mean the rule missed on the first go, and then you'd inline `baz`. We initially tried to guarantee that if rules and inlinings were both active, the rules would "win" but it was flaky and unreliable. Hence phase control. If you want robust, predictable behaviour, you should use phases. Sorry! (And then there's no reason not to inline/apply rules in the RHS.) -- Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10528#comment:35> GHC <http://www.haskell.org/ghc/> The Glasgow Haskell Compiler