[GHC] #13382: Join ceilings incorrectly getting placed outside value lambdas by SetLevels
GHC
ghc-devs at haskell.org
Mon Mar 6 10:59:17 UTC 2017
#13382: Join ceilings incorrectly getting placed outside value lambdas by SetLevels
-------------------------------------+-------------------------------------
Reporter: lukemaurer | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.1
Keywords: JoinPoints | Operating System: Unknown/Multiple
Architecture: | Type of failure: None/Unknown
Unknown/Multiple |
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
This is a latent bug, so there's no test case.
Given code like
{{{
let f = \x y z -> e1 in e2
}}}
we have `SetLevels` put a “join ceiling” around `e1` to be sure that we
don't let a join point float out, since any jump to that join point from
`e1` would be invalid. However, an oversight in `lvlFloatRhs` has us
putting the join ceiling around the lambdas instead—in other words, it
appears that we might produce
{{{
let f =
join j = ... in \x y z -> ... jump j ...
in e2
}}}
(which is wrong because you can't jump out of a lambda) rather than
{{{
let f =
\x y z -> join j = ... in ... jump j ...
in e2
}}}
As it happens, this bug is latent because of the way `FloatOut` and
`SetLevels` interact. `FloatOut` correctly understands where the join
ceiling //should// be. Then, at each join ceiling, `FloatOut` drops all
bindings marked “float me to the nearest join ceiling,” so if `j` is so
marked, the latter example (the correct one) is the result and not the
former. Nonetheless, `lvlFloatRhs` as written is clearly wrong.
(This of course illustrates a shortcoming of the “join ceiling” scheme, at
least as implemented: we rely on `FloatOut` and `SetLevels` agreeing on
where the join ceilings are. It's easy to specify where they //should//
be, but since there are two modules implementing them, we have twice the
opportunities to get it wrong.)
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13382>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list