jhc vs ghc and the surprising result involving ghcgeneratedassembly.

Simon Marlow simonmar at microsoft.com
Wed Nov 2 11:24:17 EST 2005


On 02 November 2005 13:59, Florian Weimer wrote:

> However, beginning with GCC 3.4, you can use:
> 
> extern void bar();
> 
> void foo()
> {
>   void (*p)(void) = bar;
>   p();
> }

Interesting.. though I'm not sure I'm comfortable with relying on gcc's
tail call optimisation to do the right thing.  Aren't there side
conditions that might prevent it from kicking in?
 
> And the indirect call is turned into a direct jump.  Tail recursive
> calls and really indirect tail calls are also optimzed.  Together with
> -fomit-frame-pointer, this could give you what you need, without
> post-processing the generated assembler code (which is desirable
> because the asm volatile statements inhibit further optimization).
> 
> Is it correct that you use indirect gotos across functions?  Such
> gotos aren't supported by GCC and work only by accident.

Yes, but cross-function gotos are always to the beginning of a function.
Also, our post-processor removes the function prologue from the asm.

GHC via C has always worked "by accident" :-)  But it has worked for a
long time with careful tweaking of the post-processor (known as the
mangler) for each new version of gcc.  Yes, we're living dangerously,
and it's getting harder, but we're still alive (just).

Cheers,
	Simon


More information about the Glasgow-haskell-users mailing list