[GHC] #14068: Loopification using join points
GHC
ghc-devs at haskell.org
Fri Mar 23 21:40:24 UTC 2018
#14068: Loopification using join points
-------------------------------------+-------------------------------------
Reporter: nomeata | Owner: nomeata
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: #13966 #14067 | Differential Rev(s): Phab:D3811
#14827 |
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by kavon):
Replying to [comment:52 nomeata]:
> > Question: how beneficial is it to loopify a top-level function?
>
> Well, we still want to use jumps for the recursive calls, rather than
normal function calls, even if it is top-level, right?
In the end, they'll still be emitted as jumps since they're tail calls.
Considering the transformation in isolation (i.e., ignoring knock-on
effects like inlining), using join-point throws instead of tail-recursive
calls theoretically allows us to cheapen the iteration overhead in the
following ways:
1. For joinrecs whose RHS contains a non-tail call, we can avoid a stack
check and stack pointer bumps on each iteration, since the join
continuation can keep reusing the stack frame setup on the initial entry
to the function. This depends on whether StackLayout in Cmm is optimized
to do this.
2. Optimizing argument-passing, such as by moving static arguments out of
the recursive throws, spilling rarely used arguments in high-pressure
loops, or allowing code generation to pick registers with a smaller
instruction encoding (which LLVM loves to do for x86_64).
3. Aligning a hot loop's header. Many x86_64 CPUs prefer 16-byte aligned
jump targets, but because we add info tables just before a function label,
the alignment of a function's body may only be 8-byte aligned. Code
generators can more easily align the target of a join-point throw since it
is less likely to have info table attached to it.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14068#comment:53>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list