[GHC] #15560: Full laziness destroys opportunities for join points

GHC ghc-devs at haskell.org
Fri Aug 24 15:58:03 UTC 2018


#15560: Full laziness destroys opportunities for join points
-------------------------------------+-------------------------------------
        Reporter:  AndreasK          |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.6.1
       Component:  Compiler          |              Version:  8.4.3
  (CodeGen)                          |
      Resolution:                    |             Keywords:  JoinPoints
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #14287            |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 Wow, that's an impressively large effect.  Thanks -- I had no idea.  If
 you stare at the assembly code, can you guess which of your bullets is
 causing the effect here?  E.g. do we in fact end up eliminating one of the
 jump instruction?

 Your point about the stack check is a good one.

 Info tables.  Suppose a function is:
  * top level
  * not exported
  * always called with know, saturated calls

 Then it does not need either slow entry code or an info table.  So rather
 than avoid creating such functions (by not floating join points) maybe we
 should apply the optimisation uniformly to all top-level functions?

 Hmm.  What about heap checks?  If a join point `j` does heap allocations,
 where do we do the heap-overflow check?  Maybe we should absorb the heap
 allocation into the jump site (as if the code was inlined)?  That could
 avoid doing two heap checks where only one is needed. (Would only work for
 non-recursive join points.)

 Also I'm unclear about how we save live variables around a GC call at the
 start of a join point.  (On function entry we use the function's info
 table; on a case return point we use its info table.)

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


More information about the ghc-tickets mailing list