jhc vs ghc and the surprising result involving ghc generated assembly.

Florian Weimer fw at deneb.enyo.de
Tue Nov 1 13:03:24 EST 2005

* > On Tue, 2005-11-01 at 17:30 +0100, Florian Weimer wrote:
>> > use C control constructs rather than gotos.
>> With GCC version 4, this will have no effect because the gimplifier
>> converts everything to goto-style anyway.
> Felix generates C with gotos. The result is FASTER
> than native C using gcc 4.0 on x86_64.

Coincidence. 8-)

> Felix generated C(++) code -- compiled with same options:
> int FLX_REGPARM _i1860_f1301_ack( 
> int _i1864_v1303_x, int _i1865_v1304_y)
> {
>   _us2 _i1867_v1799_ack_mv_74;
>   _us2 _i1868_v1821_ack_mv_84;

_us2 is unsigned, correct?

BTW, you shouldn't generate identifiers with leading underscores
because they are reserved for the implementation.

> I have no real idea why the Felix generated C is faster.
> Two guesses:
> (a) the two 'mv' variables declared at the top are optimised
> away, so the Felix version is only using 3 words of stack.
> (b) the "parallel assigment in tail calls optimisation"
> is saving one word on the stack (evaluating y before x
> saves a temporary across the non-tail recursion).

Both variants do not use the stack.

It seems that the goto-based version leads to different static branch
prediction results, which happen to be favorable.  If you want, try
adding __builtin_expect to the if statement in both versions, and
measure again.

More information about the Glasgow-haskell-users mailing list