#3972: ghc 6.12.1 and 6.13.20090922 consume a lot more memory than 6.10.4 when
compiling language-python package
-------------------------------+--------------------------------------------
Reporter: bjpop | Owner:
Type: bug | Status: new
Priority: high | Milestone: 6.12.3
Component: Compiler | Version: 6.12.1
Keywords: memory usage | Difficulty:
Os: Linux | Testcase:
http://projects.haskell.org/language-python/language-python-0.2.tar.gz
Architecture: x86_64 (amd64) | Failure: Compile-time performance bug
-------------------------------+--------------------------------------------
Comment(by igloo):
It looks like the main difference is that in the stable branch the getSpan
functions are getting inlined:
{{{
==================== Occurrence analysis ====================
$dSpan_al3 [ALWAYS OnceL* Nothing] :: AST.Span [AST.Expr]
LclId
[Arity 1]
$dSpan_al3 = AST.$fSpan[] @ AST.Expr AST.$fSpanExpr
lvl_smf [ALWAYS OnceL Nothing] :: AST.Expr
LclId
[]
lvl_smf =
Control.Exception.Base.patError
@ AST.Expr "ParserUtils.hs:(6,0)-(8,51)|function makeTupleOrExpr"
ParserUtils.makeTupleOrExpr :: [AST.Expr]
-> Data.Maybe.Maybe AST.Token
-> AST.Expr
LclIdX
[Arity 2]
ParserUtils.makeTupleOrExpr =
\ (ds_dla [ALWAYS Once! Nothing] :: [AST.Expr])
(ds_dlb :: Data.Maybe.Maybe AST.Token) ->
case ds_dla of wild_B1 {
[] -> lvl_smf;
: e_ag9 [ALWAYS Once Nothing] ds_dlc [ALWAYS Once! Nothing] ->
let {
ds_dla [ALWAYS Once* Nothing] :: [AST.Expr]
LclId
[]
ds_dla = wild_B1 } in
let {
fail_sme [ALWAYS Once*! Nothing] :: GHC.Prim.State#
GHC.Prim.RealWorld
-> AST.Expr
LclId
[Arity 1]
fail_sme =
\ _ ->
case ds_dlb of _ {
Data.Maybe.Nothing ->
let {
lvl_smg [ALWAYS Once Nothing] :: AST.Expr
LclId
[]
lvl_smg = AST.E10 (AST.getSpan @ [AST.Expr] $dSpan_al3
ds_dla) } in
lvl_smg;
Data.Maybe.Just t_agk [ALWAYS Once Nothing] ->
AST.E10
(AST.spanning
@ [AST.Expr] @ AST.Token $dSpan_al3 AST.$fSpanToken
ds_dla t_agk)
} } in
case ds_dlc of _ {
[] ->
case ds_dlb of _ {
Data.Maybe.Nothing -> e_ag9;
Data.Maybe.Just _ -> fail_sme GHC.Prim.realWorld#
};
: _ _ -> fail_sme GHC.Prim.realWorld#
}
}
==================== Simplifier mode 2 [main], iteration 1 out of 4
====================
Total ticks: NON-ZERO!
Result size = 2999
==================== Simplifier mode 2 [main], iteration 1 out of 4
====================
a_spy :: [AST.Expr] -> AST.SrcSpan
LclId
[Arity 1]
a_spy =
AST.$fSpan[]_getSpan
@ AST.Expr
(AST.expr_SrcSpan
`cast` (sym (AST.NTCo:T:Span AST.Expr)
:: (AST.Expr -> AST.SrcSpan) ~ AST.T:Span AST.Expr))
lvl_smf :: AST.Expr
LclId
[]
lvl_smf =
Control.Exception.Base.patError
@ AST.Expr "ParserUtils.hs:(6,0)-(8,51)|function makeTupleOrExpr"
ParserUtils.makeTupleOrExpr :: [AST.Expr]
-> Data.Maybe.Maybe AST.Token
-> AST.Expr
LclIdX
[Arity 2]
ParserUtils.makeTupleOrExpr =
\ (ds_dla :: [AST.Expr]) (ds_dlb :: Data.Maybe.Maybe AST.Token) ->
case ds_dla of wild_B1 {
[] -> lvl_smf;
: e_ag9 ds_dlc ->
let {
fail_sme :: GHC.Prim.State# GHC.Prim.RealWorld -> AST.Expr
LclId
[Arity 1]
fail_sme =
\ _ ->
case ds_dlb of _ {
Data.Maybe.Nothing ->
AST.E10
(AST.$fSpan[]_getSpan
@ AST.Expr
(AST.expr_SrcSpan
`cast` (sym (AST.NTCo:T:Span AST.Expr)
:: (AST.Expr -> AST.SrcSpan) ~ AST.T:Span
AST.Expr))
wild_B1);
Data.Maybe.Just t_agk ->
AST.E10
(let {
$j_srC :: GHC.Types.Int -> GHC.Types.Int ->
AST.SrcSpan
LclId
[Arity 2]
$j_srC =
\ (ds_alw [ALWAYS Nothing OneShot] ::
GHC.Types.Int)
(ds1_alx [ALWAYS Nothing OneShot] ::
GHC.Types.Int) ->
case ds_alw of wild1_alB { GHC.Types.I# x#_alD
->
let {
$j_srA :: GHC.Types.Int -> GHC.Types.Int ->
AST.SrcSpan
LclId
[Arity 2]
$j_srA =
\ (ds6_alJ [ALWAYS Nothing OneShot] ::
GHC.Types.Int)
(ds7_alK [ALWAYS Nothing OneShot] ::
GHC.Types.Int) ->
case ds6_alJ of wild11_alM { GHC.Types.I#
y#_alO ->
case GHC.Prim.<# x#_alD y#_alO of _ {
GHC.Bool.False ->
AST.SpanMultiLine wild11_alM ds7_alK
wild1_alB ds1_alx;
GHC.Bool.True ->
AST.SpanMultiLine wild1_alB ds1_alx
wild11_alM ds7_alK
}
} } in
case t_agk of _ {
AST.T10 ds1_apD ->
case ds1_apD of _ { AST.SpanMultiLine _ _
ds6_alJ ds7_alK ->
case ds6_alJ of wild11_alM { GHC.Types.I#
y#_alO ->
case GHC.Prim.<# x#_alD y#_alO of _ {
GHC.Bool.False ->
AST.SpanMultiLine wild11_alM ds7_alK
wild1_alB ds1_alx;
GHC.Bool.True ->
AST.SpanMultiLine wild1_alB ds1_alx
wild11_alM ds7_alK
}
}
};
AST.T11 ds1_apG ->
case ds1_apG of _ { AST.SpanMultiLine _ _
ds6_alJ ds7_alK ->
case ds6_alJ of wild11_alM { GHC.Types.I#
y#_alO ->
case GHC.Prim.<# x#_alD y#_alO of _ {
GHC.Bool.False ->
AST.SpanMultiLine wild11_alM ds7_alK
wild1_alB ds1_alx;
GHC.Bool.True ->
AST.SpanMultiLine wild1_alB ds1_alx
wild11_alM ds7_alK
}
}
};
[...]
AST.T49 ds1_arw ->
case ds1_arw of _ { AST.SpanMultiLine _ _
ds6_alJ ds7_alK ->
case ds6_alJ of wild11_alM { GHC.Types.I#
y#_alO ->
case GHC.Prim.<# x#_alD y#_alO of _ {
GHC.Bool.False ->
AST.SpanMultiLine wild11_alM ds7_alK
wild1_alB ds1_alx;
GHC.Bool.True ->
AST.SpanMultiLine wild1_alB ds1_alx
wild11_alM ds7_alK
}
}
}
}
} } in
case ds_dlc of wild1_amq {
[] ->
case e_ag9 of _ {
AST.E10 ds1_anA ->
case ds1_anA of _ { AST.SpanMultiLine ds_alw
ds1_alx _ _ ->
$j_srC ds_alw ds1_alx
};
AST.E11 ds1_anD ->
case ds1_anD of _ { AST.SpanMultiLine ds_alw
ds1_alx _ _ ->
$j_srC ds_alw ds1_alx
};
[...]
AST.E49 ds1_apt ->
case ds1_apt of _ { AST.SpanMultiLine ds_alw
ds1_alx _ _ ->
$j_srC ds_alw ds1_alx
}
};
: ipv_amu ipv1_amv ->
let {
$j_srG :: GHC.Types.Int -> GHC.Types.Int ->
AST.SrcSpan
LclId
[Arity 2]
$j_srG =
\ (ds1_amz [ALWAYS Nothing OneShot] ::
GHC.Types.Int)
(ds2_amA [ALWAYS Nothing OneShot] ::
GHC.Types.Int) ->
case ds1_amz of wild3_amE { GHC.Types.I#
x#_amG ->
let {
$j_srE :: GHC.Types.Int -> GHC.Types.Int
-> AST.SrcSpan
LclId
[Arity 2]
$j_srE =
\ (ds7_anl [ALWAYS Nothing OneShot] ::
GHC.Types.Int)
(ds8_anm [ALWAYS Nothing OneShot] ::
GHC.Types.Int) ->
case ds7_anl of wild11_ano {
GHC.Types.I# y#_anq ->
case GHC.Prim.<# x#_amG y#_anq of _ {
GHC.Bool.False -> $j_srC wild11_ano
ds8_anm;
GHC.Bool.True -> $j_srC wild3_amE
ds2_amA
}
} } in
case GHC.List.last_last' @ AST.Expr e_ag9
wild1_amq of _ {
AST.E10 ds1_anA ->
case ds1_anA of _ { AST.SpanMultiLine _
_ ds7_anl ds8_anm ->
case ds7_anl of wild11_ano {
GHC.Types.I# y#_anq ->
case GHC.Prim.<# x#_amG y#_anq of _ {
GHC.Bool.False -> $j_srC wild11_ano
ds8_anm;
GHC.Bool.True -> $j_srC wild3_amE
ds2_amA
}
}
};
AST.E11 ds1_anD ->
case ds1_anD of _ { AST.SpanMultiLine _
_ ds7_anl ds8_anm ->
case ds7_anl of wild11_ano {
GHC.Types.I# y#_anq ->
case GHC.Prim.<# x#_amG y#_anq of _ {
GHC.Bool.False -> $j_srC wild11_ano
ds8_anm;
GHC.Bool.True -> $j_srC wild3_amE
ds2_amA
}
}
};
[...]
AST.E49 ds1_apt ->
case ds1_apt of _ { AST.SpanMultiLine _
_ ds7_anl ds8_anm ->
case ds7_anl of wild11_ano {
GHC.Types.I# y#_anq ->
case GHC.Prim.<# x#_amG y#_anq of _ {
GHC.Bool.False -> $j_srC wild11_ano
ds8_anm;
GHC.Bool.True -> $j_srC wild3_amE
ds2_amA
}
}
}
}
} } in
case e_ag9 of _ {
AST.E10 ds1_anA ->
case ds1_anA of _ { AST.SpanMultiLine ds1_amz
ds2_amA _ _ ->
$j_srG ds1_amz ds2_amA
};
AST.E11 ds1_anD ->
case ds1_anD of _ { AST.SpanMultiLine ds1_amz
ds2_amA _ _ ->
$j_srG ds1_amz ds2_amA
};
[...]
AST.E49 ds1_apt ->
case ds1_apt of _ { AST.SpanMultiLine ds1_amz
ds2_amA _ _ ->
$j_srG ds1_amz ds2_amA
}
}
})
} } in
case ds_dlc of _ {
[] ->
case ds_dlb of _ {
Data.Maybe.Nothing -> e_ag9;
Data.Maybe.Just _ -> fail_sme GHC.Prim.realWorld#
};
: _ _ -> fail_sme GHC.Prim.realWorld#
}
}
}}}
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/3972#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs