[GHC] #8095: TypeFamilies painfully slow
GHC
ghc-devs at haskell.org
Mon Jul 17 20:15:05 UTC 2017
#8095: TypeFamilies painfully slow
-------------------------------------+-------------------------------------
Reporter: MikeIzbicki | Owner: goldfire
Type: bug | Status: new
Priority: high | Milestone: 8.4.1
Component: Compiler (Type | Version: 7.6.3
checker) |
Resolution: | Keywords: TypeFamilies
Operating System: Unknown/Multiple | Architecture:
Type of failure: Compile-time | Unknown/Multiple
performance bug | Test Case:
Blocked By: | Blocking:
Related Tickets: #5321, #11598, | Differential Rev(s):
#12506 |
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by mbieleck):
Here's another idea, based on comment:15: Replace every coercion resulting
from flattening type family applications with `UnivCo`. I think that could
fix the problem Simon mentioned, because the resulting `UnivCo` should
have the same free variables as the original chain of coercions. But I
know approximately nothing about GHC internals, so this may be terribly
wrong.
I am experimenting with an implementation of this idea. The code is
{{{
--- a/compiler/typecheck/TcFlatten.hs
+++ b/compiler/typecheck/TcFlatten.hs
@@ -1139,16 +1139,18 @@ flatten_fam_app tc tys -- Can be over-saturated
-- in which case the remaining arguments should
-- be dealt with by AppTys
do { let (tys1, tys_rest) = splitAt (tyConArity tc) tys
- ; (xi1, co1) <- flatten_exact_fam_app tc tys1
+ ; (xi1, _co1) <- flatten_exact_fam_app tc tys1
-- co1 :: xi1 ~ F tys1
-- all Nominal roles b/c the tycon is oversaturated
- ; (xis_rest, cos_rest) <- flatten_many (repeat Nominal) tys_rest
+ ; (xis_rest, _cos_rest) <- flatten_many (repeat Nominal)
tys_rest
-- cos_res :: xis_rest ~ tys_rest
+ ; zonkedTy <- liftTcS $ zonkTcType $ mkTyConApp tc tys
+ ; role <- getRole
; return ( mkAppTys xi1 xis_rest -- NB mkAppTys: rhs_xi might
not be a type variable
-- cf Trac #5655
- , mkAppCos co1 cos_rest
+ , mkUnsafeCo role (mkAppTys xi1 xis_rest) zonkedTy
-- (rhs_xi :: F xis) ; (F cos :: F xis ~ F
tys)
) }
}}}
Here I'm trying to generate an `UnsafeCo` of the same type as the
original.
This passes all tests but T13822, which fails with a Core Lint error, and
I have no idea why. Can someone help me debug this?
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8095#comment:35>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list