Skip to content
  • Simon Peyton Jones's avatar
    Make SetLevels do substitution properly (fixes Trac #8714) · ef44a429
    Simon Peyton Jones authored
    Nowadays SetLevels floats case expressions as well as let-bindings,
    and case expressions bind type variables.  We need to clone all such
    floated binders, to avoid accidental name capture.  But I'd forgotten
    to substitute for the cloned type variables, causing #8714.  (In the
    olden days only Ids were cloned, from let-bindings.)
    
    This patch fixes the bug and does quite a bit of clean-up refactoring
    as well, by putting the context level in the LvlEnv.
    
    There is no effect on performance, except that nofib 'rewrite' improves
    allocations by 3%.  On investigation I think it was a fluke to do with
    loop-cutting in big letrec nests.  But at least it's a fluke in the
    right direction.
    
            Program           Size    Allocs   Runtime   Elapsed  TotalMem
    --------------------------------------------------------------------------------
                Min          -0.4%     -3.0%    -19.4%    -19.4%    -26.7%
                Max          -0.0%     +0.0%    +17.9%    +17.9%      0.0%
     Geometric Mean          -0.1%     -0.0%     -0.7%     -0.7%     -0.4%
    ef44a429