Make SetLevels do substitution properly (fixes Trac #8714)
authorSimon Peyton Jones <simonpj@microsoft.com>
Tue, 11 Mar 2014 11:13:31 +0000 (11:13 +0000)
committerSimon Peyton Jones <simonpj@microsoft.com>
Tue, 11 Mar 2014 11:15:55 +0000 (11:15 +0000)
commitef44a429af4a630a153b5774d0e19dbcad8328d5
treec32a11d7a36d9308f4fc2f8aba583dbb29799927
parenta10ed3e64336e272137e1743c36970b36f7076c7
Make SetLevels do substitution properly (fixes Trac #8714)

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%
compiler/coreSyn/CoreSubst.lhs
compiler/coreSyn/CoreSyn.lhs
compiler/simplCore/SetLevels.lhs
testsuite/tests/simplCore/should_compile/T8714.hs [new file with mode: 0644]
testsuite/tests/simplCore/should_compile/all.T