Skip to content

Ticks exhausted with 8.0.2

  • *Update 2**: repro case with fewer dependencies:

Broken.hs:

{-# LANGUAGE OverloadedStrings #-}

module Broken (breaks) where

import Data.ByteString
import Data.ByteString.Builder
import Data.ByteString.Lazy (toStrict)
import Data.String (IsString(..))

newtype Query = Query ByteString

toByteString :: Builder -> ByteString
toByteString x = toStrict (toLazyByteString x)

instance IsString Query where
   fromString = Query . toByteString . stringUtf8

breaks :: [(Query, Query)]
breaks = [
    ("query", "query")
  , ("query", "query")
  , ("query", "query")
  , ("query", "query")
  , ("query", "query")
  , ("query", "query")
  , ("query", "query")
  , ("query", "query")
  , ("query", "query")
  , ("query", "query")
  , ("query", "query")
  ]

broken.cabal:

name:                broken
version:             0.1.0.0
build-type:          Simple
cabal-version:       >=1.10

library
  exposed-modules:
    Broken
  other-extensions:
      OverloadedStrings
  build-depends:
      base
    , bytestring
    , bytestring-builder
  default-language:    Haskell2010

Errors with:

ghc: panic! (the 'impossible' happened)
  (GHC version 8.0.2 for x86_64-unknown-linux):
        Simplifier ticks exhausted
  When trying UnfoldingDone pokeN_a1Db
  To increase the limit, use -fsimpl-tick-factor=N (default 100)
  If you need to do this, let GHC HQ know, and what factor you needed
  To see detailed counts use -ddump-simpl-stats
  Total ticks: 22484


  • *Update 1**: I've been able to provide a much simpler test case for this error:

Broken.hs:

{-# LANGUAGE OverloadedStrings #-}

module Broken (breaks) where

import Database.PostgreSQL.Simple.Types (Query)

breaks :: [(Query, Query)]
breaks = [
    ("query", "query")
  , ("query", "query")
  , ("query", "query")
  , ("query", "query")
  , ("query", "query")
  , ("query", "query")
  , ("query", "query")
  , ("query", "query")
  , ("query", "query")
  , ("query", "query")
  , ("query", "query")
  ]

broken.cabal:

name:                broken
version:             0.1.0.0
build-type:          Simple
cabal-version:       >=1.10

library
  exposed-modules:
    Broken
  other-extensions:
      OverloadedStrings
  build-depends:
      base
  --  >=4.9 && <4.10
    , postgresql-simple
  --  >=0.5 && <0.6
  default-language:    Haskell2010

cabal install broken.cabal results in:

ghc: panic! (the 'impossible' happened)
  (GHC version 8.0.2 for x86_64-unknown-linux):
        Simplifier ticks exhausted
  When trying UnfoldingDone ord
  To increase the limit, use -fsimpl-tick-factor=N (default 100)
  If you need to do this, let GHC HQ know, and what factor you needed
  To see detailed counts use -ddump-simpl-stats
  Total ticks: 20731

Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug


  • *Older info:**

~~This is unfortunately a closed-source codebase I'm experiencing this with, but we get a GHC panic with a small/not-doing-anything-crazy codebase:~~

ghc: panic! (the 'impossible' happened)
  (GHC version 8.0.2 for x86_64-unknown-linux):
        Simplifier ticks exhausted
  When trying RuleFired Class op return
  To increase the limit, use -fsimpl-tick-factor=N (default 100)
  If you need to do this, let GHC HQ know, and what factor you needed
  To see detailed counts use -ddump-simpl-stats
  Total ticks: 118123

When upping to -fsimpl-tick-factor=150, the error is a little different:

ghc: panic! (the 'impossible' happened)
  (GHC version 8.0.2 for x86_64-unknown-linux):
        Simplifier ticks exhausted
  When trying UnfoldingDone $
  To increase the limit, use -fsimpl-tick-factor=N (default 100)
  If you need to do this, let GHC HQ know, and what factor you needed
  To see detailed counts use -ddump-simpl-stats
  Total ticks: 177190

Upping to 200 makes the issue go away.

We're building with

ghc-options: -fhpc

Before each build, we remove all .tix files and the .hpc directory

At the point this error fires, we're compiling the 6th module of 9. The first 6 modules to compile only have a total of 635 lines of code.

To address issues I've seen in other similar tickets:

  • There are no recursive module imports
  • We don't use any {-# INLINE #-} or similar pragmas
  • There is no Template Haskell other than a makeLenses ''App for a small Snaplet.
  • We don't have any "very"/exponentially recursive code
  • We don't use any unboxed tuples (there *is* ST code in a module that's compiled, but not the one ghc panics on)
  • We don't use type families
  • We don't use TypeRep or Typeable
  • We don't use Generic

When this error occurs, it fails on a module which has very little code in it. It's mainly a list of ~200-300 Query[0] values, using OverloadedStrings. I notice Query's mappend, which we use, is INLINEd.

Please let me know if I can provide more detail!

[0] http://hackage.haskell.org/package/postgresql-simple-0.5.3.0/docs/Database-PostgreSQL-Simple-Types.html#t:Query

Edited by tom-bop
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information