[GHC] #11677: Dramatic de-optimization with "-O", "-O1", "-O2" options

GHC ghc-devs at haskell.org
Sat Mar 5 13:56:24 UTC 2016


#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 bgamari):

 Thanks for the excellent description and testcase!

 The problem here is that GHC is inlining the definition of `dict` with
 `-O1`. This means that your transformed program looks like,
 {{{#!hs
 dict' <- replicateM n ((\(k:v:_) -> (k,v)) <$> words <$> getLine)
 count <- length <$> catMaybes <$> replicateM q (flip M.lookup (M.fromList
 dict) <$> getLine)
 }}}
 Meaning that the `Map` is being reconstructed with every line that is
 read.

 You can easily discourage GHC from performing this inlining by placing a
 bang on the `dict'` binding,
 {{{#!hs
 !dict' <- M.fromList <$> replicateM n ((\(k:v:_) -> (k,v)) <$> words <$>
 getLine)
 }}}

 You were accomplishing this same end with your `evaluate $ deepseq`, but
 more "forcefully".

 Indeed it is a bit unfortunate that GHC decides that this inlining is
 beneficial, but I'm not entirely sure how it could know otherwise.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11677#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list