[GHC] #15192: Refactor of Coercion
GHC
ghc-devs at haskell.org
Fri Oct 12 07:33:08 UTC 2018
#15192: Refactor of Coercion
-------------------------------------+-------------------------------------
Reporter: ningning | Owner: ningning
Type: task | Status: new
Priority: normal | Milestone:
Component: Compiler | Version:
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s): Phab:D4747
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by ningning):
I did some experiments recently. What I did:
- add back {{{CoherenceCo}}} and related functions, such as
{{{mkCoherenceLeftCo}}} (renaming it to {{{mkCoherenceLeftCo'}}}).
- replace uses of functions defined in terms of {{{GRefl}}} to
corresponding functions defined in terms of {{{CoherenceCo}}}; for
example, replace `mkCoherenceLeftCo` with `mkCoherenceLeftCo'`
- test allocation after each change
A general observation is, {{{mkCoherenceLeftCo'}}} saves more allocation
than {{{mkCoherenceLeftCo}}} when {{{kind_co}}} is not reflexive
(similarly for {{{mkCoherenceRightCo}}})
{{{#!hs
-- | Given @ty :: k1@, @co :: k1 ~ k2@, @co2:: ty ~ ty'@,
-- produces @co' :: (ty |> co) ~r ty'
mkCoherenceLeftCo r ty co co2
| isGReflCo co = co2
| otherwise = (mkSymCo co $ GRefl r ty (MCo co)) `mktransCo` co2
-- stores an extra r and ty
mkCoherenceLeftCo' co (Refl _) = co
mkCoherenceLeftCo' (CoherenceCo co1 co2) co3 = CoherenceCo co1 (co2
`mkTransCo` co3)
mkCoherenceLeftCo' co1 co2 = CoherenceCo co1 co2
}}}
In the test case {{{T9872d}}}, {{{TcFlatten.homogenise_result}}} is
called 340k+ times, which means {{{mkCoherenceLeftCo}}} is called 340k+
times. (not exactly as {{{mkCoherenceLeftCo}}} is inlined by hand in
{{{TcFlatten.homogenise_result}}} now. Bur morally it is still true.)
If I leave everything unchanged, except for using {{{mkCoherenceLeftCo'}}}
instead of {{{mkCoherenceLeftCo}}} in {{{TcFlatten.homogenise_result}}}, I
save allocation in {{{T9872d}}} by ~2.5% and it passes the test before the
regression.
(I also tried to replace the suspicious use of {{{zipWith3}}} in
{{{TcFlatten}}} with the original implementation by {{{zipWith}}}, but it
save little allocation.)
I propose to update {{{Note [flatten_exact_fam_app_fully performance]}}}
in {{{TcFlatten}}} to include the analysis.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15192#comment:24>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list