[GHC] #13236: Improve floating for join points

GHC ghc-devs at haskell.org
Mon Feb 13 06:45:51 UTC 2017


#13236: Improve floating for join points
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      Resolution:                    |             Keywords:  JoinPoints
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by lukemaurer):

 **Question 1.** For nullary join points, yes, this would definitely be a
 better way to “ruin” them. It would just be a matter of calling `lvlMFE`
 instead of `lvlExpr` in `lvlFloatRhs` when looking at the RHS of a join
 point.

 For going to top level, we could do something similar to perform the
 operation (have the join point delegate to a function), but to make the
 decision we still need special logic saying the function must be going
 either to top level or not above the join ceiling. Otherwise we can end up
 with:

 {{{
 f a b =
   joinrec j1 x y =
     join j2 z = ... a ... b ... {- no x or y -}
     in ...
   in ...
 }}}
 becoming:
 {{{
 f a b =
   let h z = ... a ... b ...
   joinrec j1 x y =
     join j2 z = h z
     in ...
   in ...
 }}}
 at which point `j2` goes away and is effectively “ruined” just as if we
 weren't careful with join points at all.

 **Question 2.** It happens, for instance in `circsim`, where a case branch
 that's a jump gets MFE'd. There's no more or less reason to float an MFE
 as a join point than to float an join point at all, AFAIK.

 **Question 3.** There's a Note [Join points] in `FloatOut` (maybe should
 be `SetLevels` instead?) with an example. Note that the simplifier
 wouldn't be able to do the floating to flatten the nested cases, since it
 would need to know the free variables of `j2` and `j3` to float them.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13236#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list