#10148: Optimization causes repeated computation -------------------------------------+------------------------------------- Reporter: akio | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.1-rc1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Runtime | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by akio): It looks like the simplifier does not preserve correctness of demand information. After the worker-wrapper pass, I have this fragment of code {{{ of m'_axp [Dmd=<L,U(U(U))>] { Array ipv_s1i9 [Dmd=<L,A>] -> Main.Machine (gstep m'_axp) t_axr } }}} Here, the demand info on `ipv_s1i9` is correct, it is indeed unused. However, after one iteration of simplifier pass, it becomes: {{{ of m'_axp [Dmd=<L,U(U(U))>] { Array ipv_s1i9 [Dmd=<L,A>] -> (# \ (w_s3Ix :: Int) -> case w_s3Ix of _ [Occ=Dead] { GHC.Types.I# ww_X3IZ -> case $wgstep_s3II ipv_s1i9 ww_X3IZ of _ [Occ=Dead] { (# ww_X3Ja, ww_X3Jc #) -> Main.Machine ww_X3Ja ww_X3Jc } }, ww_s3IA #) }}} Now `ipv_s1i9` is referenced and will be used, but its usage information has not been updated. I've found the note `[Case alternative occ info]` in Simplify.hs, which explains why the occurrence info on case-bound variables should be zapped. I tried zapping the usage info as well as the occurrence info here (patch attached). It seems to compile `repeated2.hs` fine, but I'm not sure about a few points: * Is the approach right? i.e. is it a good idea to manually modify the usage info in the simplifier? * Probably the patch is overly conservative, in that it zaps the strictness info as well as the usage info. However, how hard should I try to preserve information? For example, should the code have a special case for when the case binder and the scrutinee are both marked unused? -- Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10148#comment:8> GHC <http://www.haskell.org/ghc/> The Glasgow Haskell Compiler