
#14880: GHC panic: updateRole -------------------------------------+------------------------------------- Reporter: RyanGlScott | Owner: goldfire Type: bug | Status: new Priority: normal | Milestone: Component: Compiler (Type | Version: 8.2.2 checker) | Resolution: | Keywords: TypeInType Operating System: Unknown/Multiple | Architecture: Type of failure: Compile-time | Unknown/Multiple crash or panic | Test Case: Blocked By: | Blocking: Related Tickets: #15076 | Differential Rev(s): Phab:D4769 Wiki Page: | -------------------------------------+------------------------------------- Comment (by tdammers): Replying to [comment:60 simonpj]:
Can you remember whether that situation involved raw VarSets, or FVs?
The old code for `tyCoFVsOfType` looked like {{{ fvs_of_type (AppTy fun arg) a b c = (fvs_of_type fun `unionFV` fvs_of_type arg) a b c }}} I believe that if you eta reduce this to {{{ fvs_of_type (AppTy fun arg) = (fvs_of_type fun `unionFV` fvs_of_type arg) }}} it runs a lot slower. That should not happen, but I recall that it did. I don't understand what you mean about "avoiding hitting the underlying `IntSet` entirely".
Well, if you look at the definition of `FV`: {{{#!haskell type FV = InterestingVarFun -- Used for filtering sets as we build them -> VarSet -- Locally bound variables -> ([Var], VarSet) -- List to preserve ordering and set to check for membership, -- so that the list doesn't have duplicates -- For explanation of why using `VarSet` is not deterministic see -- Note [Deterministic UniqFM] in UniqDFM. -> ([Var], VarSet) }}} ...then it's not immediately obvious that code that manipulates `FV`s will always touch the `VarSet`s in there at all. Specifically, variables that are not "interesting" bypass the `VarSet` (i.e., `IntSet`) machinery entirely, if I'm not mistaken. Not sure if that has anything to do with the problem at hand though. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14880#comment:61 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler