Skip to content
  • Simon Peyton Jones's avatar
    Don't float unlifted join points to top level · 7d8d0012
    Simon Peyton Jones authored and Marge Bot's avatar Marge Bot committed
    Ticket #16978 showed that we were floating a recursive,
    unlifted join point to top level.  It's very much a corner
    case:
    
        joinrec j :: Int#
                j = jump j
        in ...
    
    But somehow it showed up in a real program.
    
    For non-recursive bindings in SetLevels.lvlBind we were already
    (correctly) checking for unlifted bindings, but when I wrote
    that code I didn't think that a /recursive/ binding could be
    unlifted but /join-points/ can be!
    
    Actually I don't think that SetLevels should be floating
    join points at all.  SetLevels really floats things to move
    stuff out of loops and save allocation; but none of that applies
    to join points.  The only reason to float join points is in
    cases like
       join j1 x = join j2 y = ...
                   in ...
    which we might want to swizzle to
       join j2 x y = ... in
       join j1 x = ...
       in ...
    because now j1 looks small and might be inlined away altogether.
    But this is a very local float perhaps better done in the simplifier.
    
    Still: this patch fixes the crash, and does so in a way that is
    harmless if/when we change our strategy for floating join points.
    7d8d0012