This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Reload Pass


Rajkishore Barik wrote:

Hi,

Thanks very much. I still have doubts on your suggestion:

AFAIK, the back-end pass consists of (in order) : reg move -> insn sched -> reg class -> local alloc -> global alloc -> reload -> post-reload.
There are edges from reg move to reg class and reload back to global alloc.


In case I want to implement a linear scan which may split live ranges (pseudos) into live intervals(smaller pseudos) and allocate different registers
for each of them. This process would break the whole loop.


So, what did you mean by --- "run this pass in between the register allocator and
reload, that would probably be doable."?





Sorry, you were not specific. When I read your first message, I also thought that you were going to rewrite the reload pass in other words to use another algorithm make strict RTL when there are only hard registers and all insn constraints are satisfied.

As I understood correctly now, you are going to implement linear scan register allocator which also does what reload in gcc does.

The first of all you did not stated what are your project goals. Is it better understanding how gcc register allocator and reload work (that is a good project then) or you want to write a better register allocator which will be used in gcc. The second goal is hard to achieve because linear scan register allocator generates worse code than Chaitin-Briggs and the current gcc register allocator (Chow's priority based coloring). Another problem is that the linear scan register allocation is patented. Do you have permission to use it in gcc? Currently we have permission to Chaitin's (IBM) and Brigg's (Rice university) patents. We can not ignore patents as LLVM does not worry about patents which uses petented linear scan and Callahan-Koblentz register allocators.

IMHO, Ian wrote correctly that you can write a decent register allocator which does also reload stuff for one target (although even in this case number of details to keep in mind will be overwhelming) but it is a hard to write a decent code which works for all gcc targets. So many efforts were used to improve reload for all gcc processors (even weird ones like SH with many registers but very small displacements or mcore with few registers and small displacements), you should do the same to be successful.

Reload does a lot of things not mentioned in Zack's document like register rematerialziation, virtual register elimination, address inheritance (which is important for processor with small address displacements) and few others. There is opinion that doing some reload things before the register allocation will permit to generate a better code because register allocation will not worry about the constraints and reload will be more predictable (more accurately will work in less cases). Such project already exists (see svn branches).

In any case your work on register allocation and reload will be appreciated by the community only please be prepared that it will be not an easy way.

Vlad


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]