[GHC] #14068: Turn tail-recursive functions into recursive jointpoints
GHC
ghc-devs at haskell.org
Tue Aug 1 02:28:40 UTC 2017
#14068: Turn tail-recursive functions into recursive jointpoints
-------------------------------------+-------------------------------------
Reporter: nomeata | Owner: mpickering
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.0.1
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: #13966 #14067 | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by nomeata):
Just noting down some thoughts.
How does this work for mutually recursive bindings?
{{{
let f x y = case y of
A -> f x' y'
B -> g (x', y')
C -> e3
g p = case p of (x, y) -> f x' y'
in f 1 2 + g 3 4
}}}
Here `f` and `g` look like they might be join points. One way of doing
that would be
{{{
let f x y = joinrec $j1 x y = case y of
A -> $j1 x' y'
B -> $j2 (x', y')
C -> e3
$j2 p = case p of (x, y) -> f x' y'
in $j1 x y
g p = joinrec $j1 x y = case y of
A -> $j1 x' y'
B -> $j2 (x', y')
C -> e3
$j2 p = case p of (x, y) -> f x' y'
in $j2 p
in f 1 2 + g 3 4
}}}
but such code duplication is clearly not desired.
The next best thing I can think of is some encoding
{{{
let f_g arg = joinrec $j1 x y = case y of
A -> $j1 x' y'
B -> $j2 (x', y')
C -> e3
$j2 p = case p of (x, y) -> f x' y'
in case arg of Left (x,y) -> $j1 x y
Right p -> $j2 p
f x y = f_h (Left (x,y))
g p = f_g (Right p)
in f 1 2 + g 3 4
}}}
(maybe using unboxed sums for the parameter encoding).
This would have the desired effect, but I guess it goes too far. So I
conclude this ticket should focus on the singly recursive case.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14068#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list