[m-dev.] Mutually recursive tailcalls in hlc.

Paul Bone paul at bone.id.au
Mon Nov 9 12:27:03 AEDT 2015

On Sat, Nov 07, 2015 at 06:06:21AM +1100, Mark Brown wrote:
> On Fri, Nov 6, 2015 at 11:37 AM, Paul Bone <paul at bone.id.au> wrote:
> > I've transformed it to this:
> >
> > /* Struct is used to represent arguments for recursive calls */
> > typedef struct {
> >   MR_Float Nr;
> >   MR_Float Ni;
> >   MR_Float Cr;
> >   MR_Float Ci;
> >   MR_Integer MaxIters;
> >   MR_Integer Iters_0;
> >   MR_Integer * Iters;
> > } escape_data;
> If all the functions in the SCC take something like this as an
> argument, and return void, would gcc already make the calls tail
> recursive? Come to think of it, could you meet gcc's criteria by just
> padding out the functions in the SCC so they all have the same number
> of arguments?

Zoltan has already said that this is only one factor in the stack frame
sizes.  In addition to this I want to avoid depending on depending on any
behaviour of a C compiler in the high level C backend.  That's what the
low-level C backend is for. :-P

That said if we thought that a majority of popular C compilers could
optimise mutual recursion in the general case, then I wouldn't bother making
this change to Mercury.  I'm pretty sure that that's not the case.

Paul Bone

More information about the developers mailing list