What to do with new-ra for GCC 4.0
Daniel Berlin
dberlin@dberlin.org
Fri Jan 7 02:59:00 GMT 2005
>
> Well nobody wants to update which is why it got bit rotten like
> most other source which gets bit rotten.
> If you want to debug it and fix it, go ahead but nobody else
> wanted to do it.
This is in part, because it is so fundamentally wrongly engineered at
this point it's not worth saving.
1. We support probably 10 different types of coalescing, spilling, and
coloring mechanisms.
This by itself is not bad. The fact that they are all smashed together in
the same code, instead of using some sane technique like function
pointers, or whatever, to replace compatible pieces with other compatible
pieces (biased coloring vs non-biased coloring), means that debugging it
is a mess. Using 30 flags to control the exact behavior of the allocator
code, with a ridiculous number of ifs in the code itself based on these
flags, is not the way to go.
2. You can't replace pieces of new-ra with
other pieces, because there is no documented interface between them. I
dare you to replace the graph reducer and color chooser, and then go try
to discover why it is you suddenly start getting infinite loops.
3. The incremental liveness calculation has the absolute worst cache
behavior of anything in the compiler (unfortunate, but true. Steven
Bosscher can back me up on this). Michael believed that we could make
incremental updating and liveness fast enough for it to be practical for
us to iterate the register allocation. So far this has been incorrect,
and i don't see this changing anytime soon. I don't blame Michael for
this, it just happens to be a fact of the way things are.
The combination of these things and others, has made new-ra itself slow,
bloated, and buggy (because every data structure carries a *lot* of
info, and nobody verifies that the info is correct until something bad
happens :P).
If one stops new-ra from iterating, it actually isn't *that* much slower
than the current allocator. It also doesn't produce significantly worse
code.
However, the design and implementation issues above (and others) make it
not worth saving.
It's not particularly hard to implement the algorithmic parts of the
register allocator. I'd rather see a new one, designed and engineered
right, for the non-algorithmic parts.
In particular, the interference graph itself, the interference
graph building, coloring, and spilling should all be completely separate
components that have some sanely engineered interface between each other
so that one can replace the spiller or the color chooser in a target
without trouble. I know for a fact this is possible, because IBM's
backend does it. They have a multitude of spill choosers, color choosers,
and interference graph builders, all as nice C++ classes that derive from
a simple interface.
They also reuse the interference graph for other optimizations, which is
why it is a seperate component.
All of this is meaningless however, because the register allocator part
of register allocation just isn't that hard, and isn't the real problem
in gcc. Yes you have to have some nice way of calculating liveness, and
of handling multiple hard registers, but that is nothing compared to the
real elephant in the room, which is reload.
Nobody wants to go near reload or try an rtl with constraints
better amenable to register allocation with a 10 foot pole
because they are afraid of breaking every non-very-actively maintained
port in existence, when this is simply something that is likely to have to
happen to replace or significantly rewrite reload[1].
Until someone is willing to step up to the plate and do that, regardless
of the fact that they will probably become the single most hated person in
gcc by port maintainers (:P), nothing will happen.
--Dan
PS Just in case anyone thinks i'm being overcritical of thoes involved in
new-ra, please realize that I myself was relatively involved in new-ra, so
all of the above criticisms apply to me. I learned a lot from its
failure, and hopefully others have to. Without "post-mortems" of gcc
projects that don't make it, nobody will ever get better so that we get it
right the next time.
More information about the Gcc
mailing list