Skip to content
  • Simon Peyton Jones's avatar
    Desugar applications of 'seq' specially; fix Trac #1031 · 3bdbcf16
    Simon Peyton Jones authored
    Merge to 6.6 branch.  Test case is dsrun014.
    
    Note [Desugaring seq]  cf Trac #1031
    ~~~~~~~~~~~~~~~~~~~~~
       f x y = x `seq` (y `seq` (# x,y #))
    
    The [CoreSyn let/app invariant] means that, other things being equal, because 
    the argument to the outer 'seq' has an unlifted type, we'll use call-by-value thus:
    
       f x y = case (y `seq` (# x,y #)) of v -> x `seq` v
    
    But that is bad for two reasons: 
      (a) we now evaluate y before x, and 
      (b) we can't bind v to an unboxed pair
    
    Seq is very, very special!  So we recognise it right here, and desugar to
    	case x of _ -> case y of _ -> (# x,y #)
    
    The special case would be valid for all calls to 'seq', but it's only *necessary*
    for ones whose second argument has an unlifted type. So we only catch the latter
    case here, to avoid unnecessary tests.
    3bdbcf16