[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Fun-O Basic Edition Compiler
- To: address@hidden
- Subject: Re: Fun-O Basic Edition Compiler
- From: Bruce Hoult <address@hidden>
- Date: Fri, 4 Jan 2002 09:04:53 -0500 (EST)
- Organization: TelstraSaturn
- References: <200112211641.LAA28762@life.ai.mit.edu> <3C276FAF.F89966B9@mediaone.net> <3C28F100.9478041B@mediaone.net> <bruce-67C098.17432626122001@news.paradise.net.nz> <3C2A2420.2010404@quiotix.com>
- User-agent: MT-NewsWatcher/3.0 (PPC)
- Xref: traf.lcs.mit.edu comp.lang.dylan:13871
In article <3C2A2420.2010404@quiotix.com>, Jeffrey Siegal
<jbs@quiotix.com> wrote:
> > G4/867 K7/700
> > d2c 6.0 3.8
> > Lisp 4.7
> > Java 3.9 25.6
> > C 4.2 3.1
>
>
> Stalin (P-III/850): 3.0
What I'd expect. Stalin is known to be good.
> For reference, your C version takes 3.8 on this system. From inspection
> of the generated assembly, the difference appears to come from the
> Stalin compiling the last call to Tak as a tail call (using a C goto)
> but gcc not doing so.
In a function this tight, that's enough to explain it. If we can get
d2c to make tail calls and drop the orig_sp arg when it's not needed
then we'll be the same.
- d2c currently only does tail-call elimination on local functions, and
only self-calls at that :-( Basically, just enough so that code can
have loops without blowing the stack. It shouldn't be *too* hard to
make mutual-call elimination in a set of local fuctions. Tail-call
elimination for Generic Functions is a harder problem (in any
implementation) and tail-call ellmination for toplevel functions is hard
when you're generating a C function per Dylan function. Self-calls can
of course be handled using a simple goto or loop. Maybe that's worth
doing.
- orig_sp is a stack pointer used to pass arguments to functions for
which you have no idea what arguments they take. This could be
eliminated in many functions. Basically, a function only needs it if it
makes at least one call using a "general" entry point, or if a function
it calls needs it. This can easily be discovered during optimization.
Both these things are down in the noise for most programs as far as
speed goes, but maybe doing OK on micro-benchmarks is important for
marketing purposes. I'd like to see proper tail-call elimination from a
"supported programming styles" point of view.
> (This is "safe" mode. All run-time checks are enabled except
> integer/fixint overflow, which Stalin doesn't support. Integers will
> silently wrap.)
As in the Dylan, Java and C code.
-- Bruce