[mercury-users] Re: GC and tail calls (was: Many data elements using Mercury on Cygwin?)

Fergus Henderson fjh at cs.mu.OZ.AU
Fri Feb 7 16:37:28 AEDT 2003

On 07-Feb-2003, Douglas Auclair <dauclair at msn.com> wrote:
> >If adjusting the stack size does make the problem go away, then you might 
> >be able to eliminate the problem completely by rewriting your main loop(s) 
> >to be tail recursive, so that they do not consume stack space proportional 
> >to the size of the input.
> If one does some source-to-source transformations, my code is 
> tail-recursive.  Translation:  I do tail-calls, but not necessarily 
> tail-recursive-calls; is the compiler smart enough to optimize tail calls?  

I'm not sure exactly what you mean.  Do you mean you have tail calls
that are indirectly recursive, e.g.

	p :- ..., q.

	q :- ..., p.


If that's what you mean, then the answer depends on the compilation grade.
In the low-level C grades (e.g. asm*), and in the .NET grade (`il'),
yes, the compiler will optimize tail calls to other procedures,
so examples like the one above will consume constant stack space.

But in the high-level C grades (e.g. hlc*), no, currently only
direct tail recursion is optimized.

> Is there a way ON CYGWIN to profile the code so I can see if I'm doing tail 
> calls and that the compiler's picking that up?

In 0.11.0, there is a Mercury compiler option `--warn-non-tail-recursion'
which will warn about recursive calls which are not tail calls.
This will issue warnings for cases such as

	p :- ..., p, ...

However, it won't catch indirect non-tail recursion, e.g.

	p :- ..., q, ...
	q :- ..., p, ...

Otherwise, well, it's always possible to examine the generated code.
In the low-level C grades you can examine the generated C code and look
for occurrences of "MR_call" or "MR_tailcall" to see which calls have
been optimized into tail calls.

Fergus Henderson <fjh at cs.mu.oz.au>  |  "I have always known that the pursuit
The University of Melbourne         |  of excellence is a lethal habit"
WWW: <http://www.cs.mu.oz.au/~fjh>  |     -- the last words of T. S. Garp.
mercury-users mailing list
post:  mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-users-request at cs.mu.oz.au Message: subscribe

More information about the users mailing list