• Ben Gamari's avatar
    dmdAnal: Ensure that ExnStr flag isn't dropped inappropriately · c940e3b9
    Ben Gamari authored
    This fixes #13977 and consequently #13615. Here an optimization in the
    demand analyser was too liberal, causing us to drop the ExnStr flag and
    consequently resulting in incorrect demand signatures. This manifested
    as a segmentation fault in #13615 as we incorrectly concluded that an
    application of catchRetry# would bottom.
    
    Specifically, we had
    
        orElse' :: STM a -> STM a -> STM a
        orElse' x = catchRetry# x y
          where y = {- some action -}
    
    Where the catchRetry# primop places a demand of <xC(S),1*C1(U)> on its
    first argument. However, due to #13977 the demand analyser would assign
    a demand of <C(S),1*C1(U)> on the first argument of orElse'. Note the
    missing `x`.
    
        case orElse' bottomingAction anotherAction of { x -> Just x }
    
    being transformed to,
    
        case orElse' bottomingAction anotherAction of {}
    
    by the simplifier. This would naturally blow up when orElse' returned at
    runtime, causing the segmentation fault described in #13615.
    
    Test Plan: Validate, perhaps add a testcase
    
    Reviewers: austin, simonpj
    
    Reviewed By: simonpj
    
    Subscribers: rwbarton, thomie
    
    GHC Trac Issues: #13977, #13615
    
    Differential Revision: https://phabricator.haskell.org/D3756
    c940e3b9
Demand.hs 78.5 KB