Skip to content
  • Simon Peyton Jones's avatar
    Float unboxed expressions by boxing · 432f952e
    Simon Peyton Jones authored
    This patch makes GHC's floating more robust, by allowing it
    to float unboxed expressions of at least some common types.
    
    See Note [Floating MFEs of unlifted type] in SetLevels.
    
    This was all provoked by Trac #12603
    
    In working this through I also made a number of other corner-case
    changes in SetLevels:
    
    * Previously we inconsistently use exprIsBottom (which checks for
      bottom) instead of exprBotStrictness_maybe (which checks for
      bottoming functions).  As well as being inconsistent it was
      simply less good.
    
      See Note [Bottoming floats]
    
    * I fixed a case where were were unprofitably floating an
      expression because we thought it escaped a value lambda
      (see Note [Escaping a value lambda]).  The relevant code is
           float_me = (dest_lvl `ltMajLvl` (le_ctxt_lvl env)
                      && not float_is_lam)   -- NEW
    
    * I made lvlFloatRhs work properly in the case where abs_vars
      is non-empty.  It wasn't wrong before, but it did some stupid
      extra floating.
    432f952e