simplNonRecJoinPoint: Handle Shadowing correctly
authorJoachim Breitner <mail@joachim-breitner.de>
Thu, 26 Oct 2017 23:36:24 +0000 (19:36 -0400)
committerJoachim Breitner <mail@joachim-breitner.de>
Sun, 29 Oct 2017 04:00:16 +0000 (00:00 -0400)
commit97ca0d249c380a961a4cb90afb44bfcee1f632f2
tree296e9820843f23f1e3176e2005c98d8d61bcdf09
parent922db3dac896b8cf364c9ebaebf1a27c2468c709
simplNonRecJoinPoint: Handle Shadowing correctly

Previously, (since 33452df), simplNonRecJoinPoint would do the wrong
thing in the presence of shadowing: It analyzed the RHS of a join
binding with the environment for the body. In particular, with

    foo x =
      join x = x * x
      in x

where there is shadowing, it renames the inner x to x1, and should
produce

    foo x =
      join x1 = x * x
      in x1

but because the substitution (x ↦ x1) is also used on the RHS we get the
bogus

    foo x =
      join x1 = x1 * x1
      in x1

Fixed this by adding a `rhs_se` parameter, analogous to `simplNonRecE`
and `simplLazyBind`.

Differential Revision: https://phabricator.haskell.org/D4130
compiler/simplCore/Simplify.hs