[GHC] #11095: -O0 -g slows GHC down on list literals (compared to -O0 without -g)

GHC ghc-devs at haskell.org
Thu Jan 26 15:51:10 UTC 2017


#11095: -O0 -g slows GHC down on list literals (compared to -O0 without -g)
-------------------------------------+-------------------------------------
        Reporter:  slyfox            |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  7.10.2
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Compile-time      |  Unknown/Multiple
  performance bug                    |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):  phab:D3001
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by scpmw):

 Right, the source note gets floated outside of the `(:)` application, at
 which point the inner-most `()` is covered by source notes of all `()` in
 the list. Thus we get a quadratic growth of source notes, and redundancy
 checks blow this up to `O(n^3)`. Ouch.

 Ironically, this would likely not happen without the syntactic sugar, as
 then a source note would span the whole `(a:b)` expression (instead of
 just `b`), which would get eliminated by the mentioned "contains" check.
 This is what normally gives this stability: Once a tick gets flown up, it
 immediately hits a tick that covers a greater span, causing it to get
 eliminated. So maybe changing desugaring could actually take care of this.

 We could also attempt to merge ticks automatically. This would make them
 slightly less useful, but is clearly better than blowing up the compiler.
 On the other hand, not sure what the criterion for merging should look
 like. If we go by the span alone, we run into the tricky question of how
 far two spans can be apart until we must assume that merging them would
 stop making sense. Unfortunately, I doubt it would be hard to make up
 examples to make any given threshold look bad.

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


More information about the ghc-tickets mailing list