[GHC] #6087: Join points need strictness analysis
GHC
ghc-devs at haskell.org
Thu Feb 15 07:04:43 UTC 2018
#6087: Join points need strictness analysis
-------------------------------------+-------------------------------------
Reporter: simonpj | Owner: (none)
Type: bug | Status: infoneeded
Priority: normal | Milestone: 8.6.1
Component: Compiler | Version: 7.4.1
Resolution: | Keywords: JoinPoints
Operating System: Unknown/Multiple | Architecture:
Type of failure: Runtime | Unknown/Multiple
performance bug | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by osa1):
Now that I understand ticky profiling better I also took another look at
`cse` again.
The difference is is these two functions:
{{{
Entries Alloc Alloc'd Non-void Arguments STG Name
--------------------------------------------------------------------------------
524 12072 0 2 Li $wgo1{v r6T8}
(main:Main) (fun)
394 9984 0 2 LL $wdraw{v r6Tg}
(main:Main) (fun)
total: 918 22056
}}}
after late demand analysis this becomes:
{{{
Entries Alloc Alloc'd Non-void Arguments STG Name
--------------------------------------------------------------------------------
524 11424 0 2 Li $w$wgo{v r71J}
(main:Main) (fun)
394 12768 0 2 LL $wdraw{v r71R}
(main:Main) (fun)
total: 918 24192
}}}
Definitions: (common parts in `wdraw` functions removed)
{{{
$wgo1_r6T8 :: [GHC.Types.Char] -> GHC.Prim.Int# -> [GHC.Types.Char]
[GblId, Arity=2, Str=<S,1*U><S,1*U>m2, Unf=OtherCon []] =
sat-only [] \r [w_s6XW ww_s6XX]
case w_s6XW of {
[] -> $wxs1_r6T7 ww_s6XX;
: y_s6XZ [Occ=Once*] ys_s6Y0 [Occ=Once] ->
case ww_s6XX of ds11_s6Y1 {
__DEFAULT ->
let {
sat_s6Y3 [Occ=Once] :: [GHC.Types.Char]
[LclId] =
[ys_s6Y0 ds11_s6Y1] \u []
case -# [ds11_s6Y1 1#] of sat_s6Y2 {
__DEFAULT -> $wgo1_r6T8 ys_s6Y0 sat_s6Y2;
};
} in : [y_s6XZ sat_s6Y3];
1# -> : [y_s6XZ n_r6T1];
};
};
$wdraw_r6Tg
:: [GHC.Types.Char]
-> [Main.GenTree [GHC.Types.Char]] -> [[GHC.Types.Char]]
[GblId, Arity=2, Str=<L,1*U><S,1*U>, Unf=OtherCon []] =
sat-only [] \r [ww_s6ZI ww1_s6ZJ]
let {
sat_s70m [Occ=Once, Dmd=<L,1*U>] :: [GHC.Types.Char]
[LclId] =
[ww_s6ZI] \s []
let {
sat_s70l [Occ=Once, Dmd=<L,1*U>] :: [GHC.Types.Char]
[LclId] =
[ww_s6ZI] \s [] $wgo1_r6T8 ww_s6ZI 4#;
} in GHC.Base.++ ds10_r6SZ sat_s70l;
} in
case
case ww1_s6ZJ of {
[] -> lvl23_r6Tc;
: t_s6ZL [Occ=Once*!] ds11_s6ZM [Occ=Once!] ->
case ds11_s6ZM of {
[] ->
case
case t_s6ZL of {
Main.Node ww3_s6ZP [Occ=Once] ww4_s6ZQ
[Occ=Once] ->
$wdraw_r6Tg ww3_s6ZP ww4_s6ZQ;
}
of
sat_s6ZR
{ __DEFAULT -> $sgo1_r6SJ sat_s6ZR ds9_r6SX
xs2_r6Tf;
};
: ipv_s6ZS [Occ=Once] ipv1_s6ZT [Occ=Once] ->
let {
z_s6ZU [Occ=OnceL] :: [[GHC.Types.Char]]
[LclId] =
[ipv_s6ZS ipv1_s6ZT] \u [] $srsLoop_r6Th
ipv_s6ZS ipv1_s6ZT; } in
let {
z1_s6ZV :: [[GHC.Types.Char]]
[LclId, Unf=OtherCon []] =
CCCS :! [ds5_r6SS z_s6ZU]; } in
let {
go4_s6ZX [Occ=LoopBreaker]
:: [[GHC.Types.Char]] -> [[GHC.Types.Char]]
-> [[GHC.Types.Char]]
} in
let {
$sgo6_s6ZW [Occ=Once!T[3]]
:: [[GHC.Types.Char]]
-> [GHC.Types.Char] -> [[GHC.Types.Char]]
-> [[GHC.Types.Char]]
} in
case
case t_s6ZL of {
Main.Node ww3_s70h [Occ=Once] ww4_s70i
[Occ=Once] ->
$wdraw_r6Tg ww3_s70h ww4_s70i;
}
of
sat_s70j
{ __DEFAULT -> $sgo6_s6ZW sat_s70j ds7_r6SV
xs_r6ST;
};
};
}
of
sat_s70k
{ __DEFAULT -> $sgo2_r6SH sat_s70k sat_s70m xs1_r6T5;
};
}}}
after late demand analysis:
{{{
$w$wgo_r71J
:: [GHC.Types.Char]
-> GHC.Prim.Int# -> (# GHC.Types.Char, [GHC.Types.Char] #)
[GblId, Arity=2, Str=<S,1*U><S,1*U>, Unf=OtherCon []] =
sat-only [] \r [w_s76A w1_s76B]
case w_s76A of {
[] -> $w$wxs_r71I w1_s76B;
: y_s76D [Occ=Once*] ys_s76E [Occ=Once] ->
case w1_s76B of ds11_s76F {
__DEFAULT ->
let {
sat_s76K [Occ=Once] :: [GHC.Types.Char]
[LclId] =
[ys_s76E ds11_s76F] \u []
case -# [ds11_s76F 1#] of sat_s76G {
__DEFAULT ->
case $w$wgo_r71J ys_s76E sat_s76G of {
(#,#) ww1_s76I [Occ=Once] ww2_s76J
[Occ=Once] ->
: [ww1_s76I ww2_s76J];
};
};
} in (#,#) [y_s76D sat_s76K];
1# -> (#,#) [y_s76D n_r71D];
};
};
$wdraw_r71R
:: [GHC.Types.Char]
-> [Main.GenTree [GHC.Types.Char]] -> [[GHC.Types.Char]]
[GblId, Arity=2, Str=<L,1*U><S,1*U>, Unf=OtherCon []] =
sat-only [] \r [ww_s78p ww1_s78q]
let {
karg_s78r [Occ=Once*, Dmd=<L,1*U>] :: [GHC.Types.Char]
[LclId] =
[ww_s78p] \s []
let {
sat_s78v [Occ=Once, Dmd=<L,1*U>] :: [GHC.Types.Char]
[LclId] =
[ww_s78p] \s []
case $w$wgo_r71J ww_s78p 4# of {
(#,#) ww3_s78t [Occ=Once] ww4_s78u
[Occ=Once] ->
: [ww3_s78t ww4_s78u];
};
} in GHC.Base.++ ds10_r71B sat_s78v;
} in
case ww1_s78q of {
[] -> $sgo2_r71j lvl22_r71N karg_s78r xs1_r71H;
: t_s78x [Occ=Once*!] ds11_s78y [Occ=Once!] ->
case ds11_s78y of {
[] ->
case t_s78x of {
Main.Node ww3_s78B [Occ=Once] ww4_s78C [Occ=Once]
->
case $wdraw_r71R ww3_s78B ww4_s78C of sat_s78D
{
__DEFAULT ->
case $sgo1_r71l sat_s78D ds9_r71z
xs2_r71Q of sat_s78E {
__DEFAULT -> $sgo2_r71j sat_s78E
karg_s78r xs1_r71H;
};
};
};
: ipv_s78F [Occ=Once!] ipv1_s78G [Occ=Once] ->
let {
z_s78H [Occ=OnceL] :: [[GHC.Types.Char]]
[LclId] =
[ipv_s78F ipv1_s78G] \u []
case ipv_s78F of {
Main.Node ww3_s78J [Occ=Once] ww4_s78K
[Occ=Once] ->
$w$srsLoop_r71S ww3_s78J ww4_s78K
ipv1_s78G;
}; } in
let {
z1_s78L :: [[GHC.Types.Char]]
[LclId, Unf=OtherCon []] =
CCCS :! [ds5_r71u z_s78H]; } in
let {
go4_s78N [Occ=LoopBreaker]
:: [[GHC.Types.Char]] -> [[GHC.Types.Char]] ->
[[GHC.Types.Char]]
} in
let {
$sgo6_s78M [Occ=Once!]
:: [[GHC.Types.Char]]
-> [GHC.Types.Char] -> [[GHC.Types.Char]] ->
[[GHC.Types.Char]]
} in
case t_s78x of {
Main.Node ww3_s797 [Occ=Once] ww4_s798
[Occ=Once] ->
case $wdraw_r71R ww3_s797 ww4_s798 of
sat_s799 {
__DEFAULT ->
case $sgo6_s78M sat_s799 ds7_r71x
xs_r71v of sat_s79a {
__DEFAULT -> $sgo2_r71j sat_s79a
karg_s78r xs1_r71H;
};
};
};
};
};
}}}
Somehow new `wdraw` function should be doing more allocation but I
couldn't figure how yet. Also attached the whole STG dumps.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/6087#comment:28>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list