Skip to content
  • Ben Gamari's avatar
    dmdAnal: Move handling of datacon strictness to mkWWstr_one · d549c081
    Ben Gamari authored and Ben Gamari's avatar Ben Gamari committed
    Previously datacon strictness was accounted for when we demand analysed a case
    analysis. However, this results in pessimistic demands in some cases. For
    instance, consider the program (from T10482)
    
        data family Bar a
        data instance Bar (a, b) = BarPair !(Bar a) !(Bar b)
        newtype instance Bar Int = Bar Int
    
        foo :: Bar ((Int, Int), Int) -> Int -> Int
        foo f k =
          case f of
            BarPair x y -> case burble of
                              True -> case x of
                                        BarPair p q -> ...
                              False -> ...
    
    We really should be able to assume that `p` is already evaluated since it came
    from a strict field of BarPair.
    
    However, as written the demand analyser can not conclude this since we may end
    up in the False branch of the case on `burble` (which places no demand on `x`).
    By accounting for the data con strictness later, applied to the demand of the
    RHS, we get the strict demand signature we want.
    
    See Note [Add demands for strict constructors] for a more comprehensive
    discussion.
    
    Test Plan: Validate
    
    Reviewers: simonpj, osa1, goldfire
    
    Subscribers: rwbarton, carter
    
    GHC Trac Issues: #15696
    
    Differential Revision: https://phabricator.haskell.org/D5226
    d549c081