
#11735: Optimize coercionKind -------------------------------------+------------------------------------- Reporter: goldfire | Owner: (none) Type: task | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.10.3 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): Wiki Page: | -------------------------------------+------------------------------------- Comment (by goldfire): I think I see what's going on here. The "cached role" results are from commit 8ac966971ec6c30cc3681a913fb9fb1c2342f6cc. This version eagerly computes the role for an `NthCo` in `mkNthCo`. This means that every (`seq`ed) `NthCo` requires a role calculation. Perhaps sometimes, we create an `NthCo` and never ever check its role. If that's the case, then 8ac96 will be worse. On the other hand, what if you try my commit 8a6aa5030d34592200fbe799bf38abf3701544db? (Do not be thrown off by the same first two characters of the hash! I was.) That commit supplies the role to `mkNthCo`, as it can often be deduced by the caller of `mkNthCo` without too much trouble. No redundant role computation. This one should really be a clear win. By the way, I changed slightly the way I cached the role: I allowed a more permissive role in the `NthCo`. For example, suppose you have `g :: [a] ~N [b]` and you want `h :: a ~R b`. Before these patches, you would use `h = SubCo (NthCo 0 g)`. With the patch, you can now say `h = NthCo Representational 0 g`, where Lint checks to make sure that the role is appropriate. Because of this new degree of freedom, it became necessary to serialize the role in iface files. (The serializer could instead be clever and convert an `NthCo` into a `SubCo` and an `NthCo`, but that seemed not to be worth it.) I forget if this realization about iface files made it into the original patch -- that change might be in a later commit. But the commit I referenced above should work fine outside of iface files. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11735#comment:60 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler