diff options
author | Simon Peyton Jones <simonpj@microsoft.com> | 2014-03-11 11:13:31 +0000 |
---|---|---|
committer | Simon Peyton Jones <simonpj@microsoft.com> | 2014-03-11 11:15:55 +0000 |
commit | ef44a429af4a630a153b5774d0e19dbcad8328d5 (patch) | |
tree | c32a11d7a36d9308f4fc2f8aba583dbb29799927 /compiler/codeGen | |
parent | a10ed3e64336e272137e1743c36970b36f7076c7 (diff) | |
download | haskell-ef44a429af4a630a153b5774d0e19dbcad8328d5.tar.gz |
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%
Diffstat (limited to 'compiler/codeGen')
0 files changed, 0 insertions, 0 deletions