X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Fstranal%2FDmdAnal.lhs;h=309cd2970516ae12dcf9e0954c45d47b600f6e6d;hp=3fc84773af953823e92b89a5eeaf125dd1612aac;hb=07160d6128cd517f967749b169d03b3c1ebac0e3;hpb=32722dc3f6466f01698f7a42298a8acedd4059c2 diff --git a/compiler/stranal/DmdAnal.lhs b/compiler/stranal/DmdAnal.lhs index 3fc8477..309cd29 100644 --- a/compiler/stranal/DmdAnal.lhs +++ b/compiler/stranal/DmdAnal.lhs @@ -474,7 +474,22 @@ The thunk_cpr_ok stuff [CPR-AND-STRICTNESS] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If the rhs is a thunk, we usually forget the CPR info, because it is presumably shared (else it would have been inlined, and -so we'd lose sharing if w/w'd it into a function. +so we'd lose sharing if w/w'd it into a function). E.g. + + let r = case expensive of + (a,b) -> (b,a) + in ... + +If we marked r as having the CPR property, then we'd w/w into + + let $wr = \() -> case expensive of + (a,b) -> (# b, a #) + r = case $wr () of + (# b,a #) -> (b,a) + in ... + +But now r is a thunk, which won't be inlined, so we are no further ahead. + However, if the strictness analyser has figured out (in a previous iteration) that it's strict, then we DON'T need to forget the CPR info.