inside the GHC code generator

Bulat Ziganshin bulat.ziganshin at gmail.com
Fri Feb 24 03:37:19 EST 2006


Hello Ben,

Friday, February 24, 2006, 2:04:26 AM, you wrote:

>> * multiple results can be returned via C++ pair<a,b> template, if this is
>> efficiently implemented in gcc

BRG> There's a -freg-struct-return option in 2.x, 3.x and 4.x. I think it's off
BRG> by default on many architectures.

thank you! -1 problem. moreover, we can use just plain C for our
translation instead of C++


>> * recursive definitions translated into the for/while loops if possible

BRG> I think recent versions of GCC do a good job of this. See

BRG>      http://home.in.tum.de/~baueran/thesis/

there is no problem with proper handling of tail calls. the problem is
what these loops are not unrolled, generating significantly worse
code than explicit loop. you can see this in the files i attached to
the original letter

BRG> All of this efficiency stuff aside, there's a big problem you're neglecting:
BRG> GARBAGE COLLECTION. For a language that allocates as much as Haskell I think
BRG> a conservative collector is absolutely out of the question, because they
BRG> can't compact the heap and so allocation becomes very expensive. A copying
BRG> collector has to be able to walk the stack and find all the roots, and that
BRG> interacts very badly with optimization. All the languages I've seen that
BRG> compile via C either aren't garbage collected or use a conservative or
BRG> reference-count collector.

as i said, we can just use 2 stacks - one, pointed by EBP register,
contains all boxed values, second is hardware stack, pointed of course
by ESP, contains unboxed values and managed by gcc as for any other C
programs. so, the boxed parameters to functions are go through
EBP-pointed stack and unboxed values passed via usual C conventions:

int fac(int n, int r)

currently, EBP is used for all data and ESP is just not used.
moreover, until 1999 the same two stacks scheme was used in GHC.
comparing to current one stack scheme, we will need more space for
stacks and may lose something because memory usage patterns will be
slightly less localized


-- 
Best regards,
 Bulat                            mailto:Bulat.Ziganshin at gmail.com



More information about the Glasgow-haskell-users mailing list