[GHC] #7258: Compiling DynFlags is jolly slow
GHC
ghc-devs at haskell.org
Tue Oct 24 14:32:45 UTC 2017
#7258: Compiling DynFlags is jolly slow
-------------------------------------+-------------------------------------
Reporter: simonpj | Owner: simonpj
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.6.1
Resolution: | Keywords: deriving-perf
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 tdammers):
Core for monadic-bind style Read instance:
{{{
[1 of 1] Compiling D ( examples/t-10-read.hs,
examples/t-10-read.o )
==================== Tidy Core ====================
Result size of Tidy Core = {terms: 373, types: 324, coercions: 0}
-- RHS size: {terms: 269, types: 160, coercions: 0}
$creadPrec_r1Hl
$creadPrec_r1Hl =
parens
(prec
(I# 11#)
(>>
$fMonadReadPrec
(expectP (Ident (unpackCString# "DT"#)))
(>>
$fMonadReadPrec
(expectP (Punc (unpackCString# "{"#)))
(>>
$fMonadReadPrec
(expectP (Ident (unpackCString# "field0"#)))
(>>
$fMonadReadPrec
(expectP (Punc (unpackCString# "="#)))
(>>=
$fMonadReadPrec
(reset (readPrec $fReadInt))
(\ a1_a1tq ->
>>
$fMonadReadPrec
(expectP (Punc (unpackCString# ","#)))
(>>
$fMonadReadPrec
(expectP (Ident (unpackCString# "field2"#)))
(>>
$fMonadReadPrec
(expectP (Punc (unpackCString# "="#)))
(>>=
$fMonadReadPrec
(reset (readPrec $fReadInt))
(\ a2_a1tr ->
>>
$fMonadReadPrec
(expectP (Punc (unpackCString#
","#)))
(>>
$fMonadReadPrec
(expectP (Ident
(unpackCString# "field3"#)))
(>>
$fMonadReadPrec
(expectP (Punc
(unpackCString# "="#)))
(>>=
$fMonadReadPrec
(reset (readPrec
$fReadInt))
(\ a3_a1ts ->
>>
$fMonadReadPrec
(expectP (Punc
(unpackCString# ","#)))
(>>
$fMonadReadPrec
(expectP
(Ident
(unpackCString# "field4"#)))
(>>
$fMonadReadPrec
(expectP
(Punc (unpackCString# "="#)))
(>>=
$fMonadReadPrec
(reset
(readPrec $fReadInt))
(\ a4_a1tt
->
>>
$fMonadReadPrec
(expectP
(Punc
(unpackCString# ","#)))
(>>
$fMonadReadPrec
(expectP
(Ident
(unpackCString#
"field5"#)))
(>>
$fMonadReadPrec
(expectP
(Punc
(unpackCString#
"="#)))
(>>=
$fMonadReadPrec
(reset
(readPrec
$fReadInt))
(\ a5_a1tu ->
>>
$fMonadReadPrec
(expectP
(Punc
(unpackCString#
","#)))
(>>
$fMonadReadPrec
(expectP
(Ident
(unpackCString#
"field6"#)))
(>>
$fMonadReadPrec
(expectP
(Punc
(unpackCString#
"="#)))
(>>=
$fMonadReadPrec
(reset
(readPrec
$fReadInt))
(\ a6_a1tv ->
>>
$fMonadReadPrec
(expectP
(Punc
(unpackCString#
","#)))
(>>
$fMonadReadPrec
(expectP
(Ident
(unpackCString#
"field7"#)))
(>>
$fMonadReadPrec
(expectP
(Punc
(unpackCString#
"="#)))
(>>=
$fMonadReadPrec
(reset
(readPrec
$fReadInt))
(\ a7_a1tw ->
>>
$fMonadReadPrec
(expectP
(Punc
(unpackCString#
","#)))
(>>
$fMonadReadPrec
(expectP
(Ident
(unpackCString#
"field8"#)))
(>>
$fMonadReadPrec
(expectP
(Punc
(unpackCString#
"="#)))
(>>=
$fMonadReadPrec
(reset
(readPrec
$fReadInt))
(\ a8_a1tx ->
>>
$fMonadReadPrec
(expectP
(Punc
(unpackCString#
","#)))
(>>
$fMonadReadPrec
(expectP
(Ident
(unpackCString#
"field9"#)))
(>>
$fMonadReadPrec
(expectP
(Punc
(unpackCString#
"="#)))
(>>=
$fMonadReadPrec
(reset
(readPrec
$fReadInt))
(\ a9_a1ty ->
>>
$fMonadReadPrec
(expectP
(Punc
(unpackCString#
","#)))
(>>
$fMonadReadPrec
(expectP
(Ident
(unpackCString#
"field10"#)))
(>>
$fMonadReadPrec
(expectP
(Punc
(unpackCString#
"="#)))
(>>=
$fMonadReadPrec
(reset
(readPrec
$fReadInt))
(\ a10_a1tz ->
>>
$fMonadReadPrec
(expectP
(Punc
(unpackCString#
"}"#)))
(return
$fMonadReadPrec
(DT
a1_a1tq
a2_a1tr
a3_a1ts
a4_a1tt
a5_a1tu
a6_a1tv
a7_a1tw
a8_a1tx
a9_a1ty
a10_a1tz)))))))))))))))))))))))))))))))))))))))))))))
Rec {
-- RHS size: {terms: 5, types: 1, coercions: 0}
$fReadDT
$fReadDT =
C:Read
$creadsPrec_r1I5
$creadList_r1I6
$creadPrec_r1Hl
$creadListPrec_r1I7
-- RHS size: {terms: 2, types: 1, coercions: 0}
$creadsPrec_r1I5
$creadsPrec_r1I5 = $dmreadsPrec $fReadDT
-- RHS size: {terms: 2, types: 1, coercions: 0}
$creadList_r1I6
$creadList_r1I6 = readListDefault $fReadDT
-- RHS size: {terms: 2, types: 1, coercions: 0}
$creadListPrec_r1I7
$creadListPrec_r1I7 = readListPrecDefault $fReadDT
end Rec }
-- RHS size: {terms: 5, types: 12, coercions: 0}
field9
field9 =
\ ds_d1H8 ->
case ds_d1H8
of _
{ DT ds1_d1H9 ds2_d1Ha ds3_d1Hb ds4_d1Hc ds5_d1Hd ds6_d1He ds7_d1Hf
ds8_d1Hg ds9_d1Hh ds10_d1Hi ->
ds9_d1Hh
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field8
field8 =
\ ds_d1GX ->
case ds_d1GX
of _
{ DT ds1_d1GY ds2_d1GZ ds3_d1H0 ds4_d1H1 ds5_d1H2 ds6_d1H3 ds7_d1H4
ds8_d1H5 ds9_d1H6 ds10_d1H7 ->
ds8_d1H5
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field7
field7 =
\ ds_d1GM ->
case ds_d1GM
of _
{ DT ds1_d1GN ds2_d1GO ds3_d1GP ds4_d1GQ ds5_d1GR ds6_d1GS ds7_d1GT
ds8_d1GU ds9_d1GV ds10_d1GW ->
ds7_d1GT
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field6
field6 =
\ ds_d1GB ->
case ds_d1GB
of _
{ DT ds1_d1GC ds2_d1GD ds3_d1GE ds4_d1GF ds5_d1GG ds6_d1GH ds7_d1GI
ds8_d1GJ ds9_d1GK ds10_d1GL ->
ds6_d1GH
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field5
field5 =
\ ds_d1Gq ->
case ds_d1Gq
of _
{ DT ds1_d1Gr ds2_d1Gs ds3_d1Gt ds4_d1Gu ds5_d1Gv ds6_d1Gw ds7_d1Gx
ds8_d1Gy ds9_d1Gz ds10_d1GA ->
ds5_d1Gv
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field4
field4 =
\ ds_d1Gf ->
case ds_d1Gf
of _
{ DT ds1_d1Gg ds2_d1Gh ds3_d1Gi ds4_d1Gj ds5_d1Gk ds6_d1Gl ds7_d1Gm
ds8_d1Gn ds9_d1Go ds10_d1Gp ->
ds4_d1Gj
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field3
field3 =
\ ds_d1G4 ->
case ds_d1G4
of _
{ DT ds1_d1G5 ds2_d1G6 ds3_d1G7 ds4_d1G8 ds5_d1G9 ds6_d1Ga ds7_d1Gb
ds8_d1Gc ds9_d1Gd ds10_d1Ge ->
ds3_d1G7
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field2
field2 =
\ ds_d1FT ->
case ds_d1FT
of _
{ DT ds1_d1FU ds2_d1FV ds3_d1FW ds4_d1FX ds5_d1FY ds6_d1FZ ds7_d1G0
ds8_d1G1 ds9_d1G2 ds10_d1G3 ->
ds2_d1FV
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field10
field10 =
\ ds_d1FI ->
case ds_d1FI
of _
{ DT ds1_d1FJ ds2_d1FK ds3_d1FL ds4_d1FM ds5_d1FN ds6_d1FO ds7_d1FP
ds8_d1FQ ds9_d1FR ds10_d1FS ->
ds10_d1FS
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field0
field0 =
\ ds_d1Fx ->
case ds_d1Fx
of _
{ DT ds1_d1Fy ds2_d1Fz ds3_d1FA ds4_d1FB ds5_d1FC ds6_d1FD ds7_d1FE
ds8_d1FF ds9_d1FG ds10_d1FH ->
ds1_d1Fy
}
-- RHS size: {terms: 2, types: 0, coercions: 0}
$trModule1_r1I8
$trModule1_r1I8 = TrNameS "main"#
-- RHS size: {terms: 2, types: 0, coercions: 0}
$trModule2_r1I9
$trModule2_r1I9 = TrNameS "D"#
-- RHS size: {terms: 3, types: 0, coercions: 0}
$trModule
$trModule = Module $trModule1_r1I8 $trModule2_r1I9
-- RHS size: {terms: 2, types: 0, coercions: 0}
$tc'DT1_r1Ia
$tc'DT1_r1Ia = TrNameS "'DT"#
-- RHS size: {terms: 5, types: 0, coercions: 0}
$tc'DT
$tc'DT =
TyCon
9521127001609462311## 17424978011088396301## $trModule $tc'DT1_r1Ia
-- RHS size: {terms: 2, types: 0, coercions: 0}
$tcDT1_r1Ib
$tcDT1_r1Ib = TrNameS "DT"#
-- RHS size: {terms: 5, types: 0, coercions: 0}
$tcDT
$tcDT =
TyCon
14693474152448962618## 5168028270650093369## $trModule $tcDT1_r1Ib
}}}
And for applicative-style Read implementation:
{{{
[1 of 1] Compiling D ( examples/t-10-read-appl.hs,
examples/t-10-read-appl.o )
==================== Tidy Core ====================
Result size of Tidy Core = {terms: 272, types: 324, coercions: 0}
-- RHS size: {terms: 168, types: 160, coercions: 0}
$creadsPrec_r1Gi
$creadsPrec_r1Gi =
\ p_aNu ->
readP_to_S
(<*
$fApplicativeReadP
(*>
$fApplicativeReadP
(string (unpackCString# "DT{"#))
(<*>
$fApplicativeReadP
(<*>
$fApplicativeReadP
(<*>
$fApplicativeReadP
(<*>
$fApplicativeReadP
(<*>
$fApplicativeReadP
(<*>
$fApplicativeReadP
(<*>
$fApplicativeReadP
(<*>
$fApplicativeReadP
(<*>
$fApplicativeReadP
(<$>
$fFunctorReadP
DT
(*>
$fApplicativeReadP
(string (unpackCString#
"field0="#))
(readS_to_P (readsPrec
$fReadInt p_aNu))))
(*>
$fApplicativeReadP
(string (unpackCString# ","#))
(*>
$fApplicativeReadP
(string (unpackCString#
"field1="#))
(readS_to_P (readsPrec
$fReadInt p_aNu)))))
(*>
$fApplicativeReadP
(string (unpackCString# ","#))
(*>
$fApplicativeReadP
(string (unpackCString#
"field2="#))
(readS_to_P (readsPrec $fReadInt
p_aNu)))))
(*>
$fApplicativeReadP
(string (unpackCString# ","#))
(*>
$fApplicativeReadP
(string (unpackCString#
"field3="#))
(readS_to_P (readsPrec $fReadInt
p_aNu)))))
(*>
$fApplicativeReadP
(string (unpackCString# ","#))
(*>
$fApplicativeReadP
(string (unpackCString# "field4="#))
(readS_to_P (readsPrec $fReadInt
p_aNu)))))
(*>
$fApplicativeReadP
(string (unpackCString# ","#))
(*>
$fApplicativeReadP
(string (unpackCString# "field5="#))
(readS_to_P (readsPrec $fReadInt
p_aNu)))))
(*>
$fApplicativeReadP
(string (unpackCString# ","#))
(*>
$fApplicativeReadP
(string (unpackCString# "field6="#))
(readS_to_P (readsPrec $fReadInt p_aNu)))))
(*>
$fApplicativeReadP
(string (unpackCString# ","#))
(*>
$fApplicativeReadP
(string (unpackCString# "field7="#))
(readS_to_P (readsPrec $fReadInt p_aNu)))))
(*>
$fApplicativeReadP
(string (unpackCString# ","#))
(*>
$fApplicativeReadP
(string (unpackCString# "field8="#))
(readS_to_P (readsPrec $fReadInt p_aNu)))))
(*>
$fApplicativeReadP
(string (unpackCString# ","#))
(*>
$fApplicativeReadP
(string (unpackCString# "field9="#))
(readS_to_P (readsPrec $fReadInt p_aNu))))))
(string (unpackCString# "}"#)))
Rec {
-- RHS size: {terms: 5, types: 1, coercions: 0}
$fReadDT
$fReadDT =
C:Read
$creadsPrec_r1Gi
$creadList_r1GT
$creadPrec_r1GU
$creadListPrec_r1GV
-- RHS size: {terms: 2, types: 1, coercions: 0}
$creadList_r1GT
$creadList_r1GT = $dmreadList $fReadDT
-- RHS size: {terms: 2, types: 1, coercions: 0}
$creadPrec_r1GU
$creadPrec_r1GU = $dmreadPrec $fReadDT
-- RHS size: {terms: 2, types: 1, coercions: 0}
$creadListPrec_r1GV
$creadListPrec_r1GV = $dmreadListPrec $fReadDT
end Rec }
-- RHS size: {terms: 5, types: 12, coercions: 0}
field9
field9 =
\ ds_d1G5 ->
case ds_d1G5
of _
{ DT ds1_d1G6 ds2_d1G7 ds3_d1G8 ds4_d1G9 ds5_d1Ga ds6_d1Gb ds7_d1Gc
ds8_d1Gd ds9_d1Ge ds10_d1Gf ->
ds9_d1Ge
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field8
field8 =
\ ds_d1FU ->
case ds_d1FU
of _
{ DT ds1_d1FV ds2_d1FW ds3_d1FX ds4_d1FY ds5_d1FZ ds6_d1G0 ds7_d1G1
ds8_d1G2 ds9_d1G3 ds10_d1G4 ->
ds8_d1G2
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field7
field7 =
\ ds_d1FJ ->
case ds_d1FJ
of _
{ DT ds1_d1FK ds2_d1FL ds3_d1FM ds4_d1FN ds5_d1FO ds6_d1FP ds7_d1FQ
ds8_d1FR ds9_d1FS ds10_d1FT ->
ds7_d1FQ
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field6
field6 =
\ ds_d1Fy ->
case ds_d1Fy
of _
{ DT ds1_d1Fz ds2_d1FA ds3_d1FB ds4_d1FC ds5_d1FD ds6_d1FE ds7_d1FF
ds8_d1FG ds9_d1FH ds10_d1FI ->
ds6_d1FE
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field5
field5 =
\ ds_d1Fn ->
case ds_d1Fn
of _
{ DT ds1_d1Fo ds2_d1Fp ds3_d1Fq ds4_d1Fr ds5_d1Fs ds6_d1Ft ds7_d1Fu
ds8_d1Fv ds9_d1Fw ds10_d1Fx ->
ds5_d1Fs
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field4
field4 =
\ ds_d1Fc ->
case ds_d1Fc
of _
{ DT ds1_d1Fd ds2_d1Fe ds3_d1Ff ds4_d1Fg ds5_d1Fh ds6_d1Fi ds7_d1Fj
ds8_d1Fk ds9_d1Fl ds10_d1Fm ->
ds4_d1Fg
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field3
field3 =
\ ds_d1F1 ->
case ds_d1F1
of _
{ DT ds1_d1F2 ds2_d1F3 ds3_d1F4 ds4_d1F5 ds5_d1F6 ds6_d1F7 ds7_d1F8
ds8_d1F9 ds9_d1Fa ds10_d1Fb ->
ds3_d1F4
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field2
field2 =
\ ds_d1EQ ->
case ds_d1EQ
of _
{ DT ds1_d1ER ds2_d1ES ds3_d1ET ds4_d1EU ds5_d1EV ds6_d1EW ds7_d1EX
ds8_d1EY ds9_d1EZ ds10_d1F0 ->
ds2_d1ES
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field10
field10 =
\ ds_d1EF ->
case ds_d1EF
of _
{ DT ds1_d1EG ds2_d1EH ds3_d1EI ds4_d1EJ ds5_d1EK ds6_d1EL ds7_d1EM
ds8_d1EN ds9_d1EO ds10_d1EP ->
ds10_d1EP
}
-- RHS size: {terms: 5, types: 12, coercions: 0}
field0
field0 =
\ ds_d1Eu ->
case ds_d1Eu
of _
{ DT ds1_d1Ev ds2_d1Ew ds3_d1Ex ds4_d1Ey ds5_d1Ez ds6_d1EA ds7_d1EB
ds8_d1EC ds9_d1ED ds10_d1EE ->
ds1_d1Ev
}
-- RHS size: {terms: 2, types: 0, coercions: 0}
$trModule1_r1GW
$trModule1_r1GW = TrNameS "main"#
-- RHS size: {terms: 2, types: 0, coercions: 0}
$trModule2_r1GX
$trModule2_r1GX = TrNameS "D"#
-- RHS size: {terms: 3, types: 0, coercions: 0}
$trModule
$trModule = Module $trModule1_r1GW $trModule2_r1GX
-- RHS size: {terms: 2, types: 0, coercions: 0}
$tc'DT1_r1GY
$tc'DT1_r1GY = TrNameS "'DT"#
-- RHS size: {terms: 5, types: 0, coercions: 0}
$tc'DT
$tc'DT =
TyCon
9521127001609462311## 17424978011088396301## $trModule $tc'DT1_r1GY
-- RHS size: {terms: 2, types: 0, coercions: 0}
$tcDT1_r1GZ
$tcDT1_r1GZ = TrNameS "DT"#
-- RHS size: {terms: 5, types: 0, coercions: 0}
$tcDT
$tcDT =
TyCon
14693474152448962618## 5168028270650093369## $trModule $tcDT1_r1GZ
}}}
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/7258#comment:45>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list