[MLton] native vs. C code generation
Matthew Fluet
fluet@cs.cornell.edu
Thu, 2 Jun 2005 14:34:08 -0400 (EDT)
> I've computed an average of native vs. C code speed. It turned out that C
> code is 35% slower than native on average (ok this is not a real average).
> Considering code size it's about 10%. My question is then: does it make
> sense to write native codegenerator for a new platform? And, how much effort
> would it be?
Well, there are a number of individuals using MLton on Sparc and PowerPC
using only the C codegen.
"Does it make sense to write a native codegen?" If you re-phrase the
question as "Will a highly tuned native codegen be better than the C
codegen and gcc?", then the answer is almost certainly "yes". There is a
lot of semantic meaning that we can't convey to gcc through the C
language. Likewise, the fact that the C codegen is %35 slower than the
native codegen should not be taken as an upper bound on the performance of
a native codegen, as the x86 codegen is the product of my early
association with MLton; the native backend hasn't received much of an
overhaul since it was originally written (and virtually every other part
of the compiler has since then). For example, the register allocator is
notoriously bad:
http://mlton.org/pipermail/mlton/2004-June/025511.html
http://mlton.org/pipermail/mlton/2004-July/025519.html
And, a choice quote from that thread:
There are some nagging questions, like what could the native codegen
possibly be doing that improves over gcc? I've conjectured that the
native codegen makes better use of alias information than gcc does. (In
particular, from gcc's perspective both the ML stack and the ML heap
alias, so every stack-slot operation conflicts with every heap cell
manipulation.) I wrote up some experiments, with some surprising
results, at:
http://www.mlton.org/pipermail/mlton/2002-November/013253.html
The whole thread there has some other interesting points.
There appear to be definite gains available in the native codegen, but it
isn't clear that more tuning of the C codegen wouldn't also close the gap.
Other ways of rephrasing the question:
* "Are there likely to be interesting research questions raised by
writing a new native codegen?" -- answer: probably not
* "Would writing a new native codegen be an appropriate undergrad
or early gard project?" -- answer: possibly; note, there are
ancillary benefits to working on MLton (I've gotten one nice
research paper out of it, ideas for future papers, all out of my
initial association writing a native backend).
"How much effort would it be?" The x86 native codegen is the product of
one full-time summer internship (2000), one half-time summer internship
(2001), and steady part-time work (since fall 2000). And the x86 native
codegen is by no means a highly tuned beast. We've revised the lowest
level ILs since the x86 native codegen was started (for the better, making
future native codegens likely to be slightly easier), but I would still
estimate a good 4 to 6 months of full-time work to get something in the
ballpark (i.e., with the C-codgen about 25% slower).
So, probably the best answer is what one thinks of that trade off:
say, 6 months of work for 1.3X speedup.
I'll conclude with the fact that I started down the MLton/C-- experiment
(the thread I referred to in the previous message) both to foster some
exchange with a project whose reasearchers I've spent a lot of time with,
but also as a means of exploring ways of getting out of the native-codegen
game. Between MLRISC, C--, LLVM, etc., there appear to be a number of
projects that are aiming at providing a simpler means of targetting
multiple platforms without the downside of emitting portable C and without
the cost of writing multiple codegens.