[GHC] #15164: Slowdown in ghc compile times from GHC 8.0.2 to GHC 8.2.1 when doing Called arity analysis
GHC
ghc-devs at haskell.org
Sat May 19 21:41:17 UTC 2018
#15164: Slowdown in ghc compile times from GHC 8.0.2 to GHC 8.2.1 when doing Called
arity analysis
-------------------------------------+-------------------------------------
Reporter: flip101 | Owner: (none)
Type: bug | Status: new
Priority: highest | Milestone: 8.6.1
Component: Compiler | Version: 8.2.1
Resolution: | Keywords:
Operating System: Linux | Architecture: x86_64
Type of failure: Compile-time | (amd64)
performance bug | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by nomeata):
If I focus on this part of the code:
{{{
newtype ActualParameterPart = APP (NT AssociationList)
instance Rule f AssociationList => Rule f ActualParameterPart where
get = APP <$> n93
}}}
then with 8.0 I get this code for the instance method:
{{{
-- RHS size: {terms: 12, types: 18, coercions: 0}
$cget_a1BB
:: forall (f_a1By :: * -> *).
(Rule f_a1By AssociationList, Decorator f_a1By) =>
f_a1By ActualParameterPart
[LclId, Str=DmdType]
$cget_a1BB =
\ (@ (f_a1By :: * -> *))
($dRule_a1Bz :: Rule f_a1By AssociationList)
($dDecorator_a1BD :: Decorator f_a1By) ->
<$>
@ f_a1By
@ (NT AssociationList)
@ ActualParameterPart
(GHC.Base.$p1Applicative
@ f_a1By
(GHC.Base.$p1Monad
@ f_a1By (Level4.$p1Decorator @ f_a1By $dDecorator_a1BD)))
Level4.APP
(n93 @ f_a1By $dDecorator_a1BD @ AssociationList $dRule_a1Bz)
}}}
but with 8.4 I get
{{{
-- RHS size: {terms: 2,474,
types: 2,544,
coercions: 0,
joins: 0/630}
$cget_a2E1 [Occ=LoopBreaker]
:: forall (f :: * -> *).
(Rule f AssociationList, Decorator f) =>
f ActualParameterPart
[LclId]
$cget_a2E1
= \ (@ (f_a2DY :: * -> *))
_ [Occ=Dead]
($dDecorator_a2E4 :: Decorator f_a2DY) ->
letrec {
$dRule_a7WP :: Rule f_a2DY QualifiedExpression
[LclId]
$dRule_a7WP
= Level4.$fRulefQualifiedExpression
@ f_a2DY $dRule_a7Qw $dRule_a7Wx;
$dRule_a7VU :: Rule f_a2DY FunctionCall
[LclId]
$dRule_a7VU = Level4.$fRulefFunctionCall @ f_a2DY $dRule_a7VQ;
… thousands of lines omitted …
$dRule_a7Qv [Occ=LoopBreaker] :: Rule f_a2DY Name
[LclId]
$dRule_a7Qv
= Level4.$fRulefName
@ f_a2DY $dRule_a7Ux $dRule_a7Uy $dRule_a7Uz; } in
letrec {
$dRule_a7Th :: Rule f_a2DY FunctionCall
[LclId]
$dRule_a7Th = Level4.$fRulefFunctionCall @ f_a2DY $dRule_a7Qy;
… again thousands of lines omitted …
$dRule_a7Qy [Occ=LoopBreaker] :: Rule f_a2DY Name
[LclId]
$dRule_a7Qy
= Level4.$fRulefName
@ f_a2DY $dRule_a7Te $dRule_a7Tf $dRule_a7Tg; } in
letrec {
$dRule_a7QO :: Rule f_a2DY TypeMark
[LclId]
$dRule_a7QO = Level4.$fRulefTypeMark @ f_a2DY $dRule_a7QB;
… again …
$dRule_a7Qx [Occ=LoopBreaker] :: Rule f_a2DY Expression
[LclId]
$dRule_a7Qx = Level4.$fRulefExpression @ f_a2DY $dRule_a7Qz; } in
letrec {
$dRule_a7Qo :: Rule f_a2DY QualifiedExpression
[LclId]
$dRule_a7Qo
= Level4.$fRulefQualifiedExpression
@ f_a2DY $dRule_a7ML $dRule_a7Q6;
…
… and a few more of those …
$dRule_a7MM
= Level4.$fRulefName
@ f_a2DY $dRule_a7MN $dRule_a7MO $dRule_a7MP; } in
<$>
@ f_a2DY
@ (NT AssociationList)
@ ActualParameterPart
(GHC.Base.$p1Applicative
@ f_a2DY
(GHC.Base.$p1Monad
@ f_a2DY (Level4.$p1Decorator @ f_a2DY $dDecorator_a2E4)))
Level4.APP
(n93
@ f_a2DY
$dDecorator_a2E4
@ AssociationList
(Level4.$fRulefAssociationList
@ f_a2DY
(Level4.$fRulefAssociationElement
@ f_a2DY
(Level4.$fRulefFormalPart
@ f_a2DY
(Level4.$fRulefFormalDesignator @ f_a2DY $dRule_a7MM)
$dRule_a7MK
$dRule_a7ML)
(Level4.$fRulefActualPart
@ f_a2DY
(Level4.$fRulefActualDesignator @ f_a2DY $dRule_a7Qx
$dRule_a7Qy)
$dRule_a7Qv
$dRule_a7Qw))))
}}}
The important change seems to be:
* Previously, the code for `get` would use the dictionary for `Rule f_a1By
AssociationList` passed to it, here named `$dRule_a1Bz`.
* Now, it ''ignores'' the dictionary passed to it (note `_ [Occ=Dead]`)
and instead seems to build the dictionary it passes to `n93` locally,
using many very large local let-recs.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/15164#comment:14>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list