[GHC] #15091: Better occurrence analysis for join points

GHC ghc-devs at haskell.org
Thu Apr 26 16:38:24 UTC 2018


#15091: Better occurrence analysis for join points
-------------------------------------+-------------------------------------
           Reporter:  simonpj        |             Owner:  (none)
               Type:  task           |            Status:  new
           Priority:  normal         |         Milestone:  8.6.1
          Component:  Compiler       |           Version:  8.2.2
           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:
-------------------------------------+-------------------------------------
 Consider this
 {{{
 let x = ... in
 join j y = x+y in
 case v of
   A -> x
   B -> j 1
   C -> j 2
   D -> 3
 }}}
 What does `OccAnal` say about `x`'s usage?  It says `ManyOccs`!

 But it's plain as a pikestaff that `x` is used at most once:
 * Either in the `A` branch,
 * or in the `B` or `C` branches via `j`.

 If instead we had inlined `j` we'd have
 {{{
 let x = ... in
 join j y = x+y in
 case v of
   A -> x
   B -> x + 1
   C -> x + 2
   D -> 3
 }}}
 and now it's all more obvious: `x`'s occurrence info should be `OneOcc {
 occ_one_br = False }`, not `ManyOccs`.

 Does this matter?  Not a great deal, but there is a reason for having
 `OneOcc` with `occ_one_br = False`, and it seems a shame not to take
 advantage.

 One case in point is the definition of `SimplUtils.isExitJoinId
 {{{
 isExitJoinId :: Var -> Bool
 isExitJoinId id = isJoinId id && isOneOcc (idOccInfo id) && occ_in_lam
 (idOccInfo id)
 }}}
 Something does not cease to be an exit-join-point if it is mentioned in
 multiple places
 as above.

 Another use for this info is `postInlineUnconditionally`.

 Could we improve this situation?   I think it'd be quite easy.  For non-
 recursive join points `j = rhs`

 * Gather occurrence info from the RHS
 * Bind `j` to its occurrence info
 * Unleash that occurrence info at each jump-site for `j`, just as if it
 had been inlined.

 See Trac #14152, comment:40.

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


More information about the ghc-tickets mailing list