global register allocation.

As far as I understand , the regalloc passes provided operate on basic block level?
Is there anything that operate on the whole Module?

Thx,
Sanjiv

Hi, Sanjiv,

     those passes operate on the whole machine function. Each machine function contains many basic blocks. If a program has many functions, the register allocator will be called as many times, i.e it does not do interprocedural allocation.

best,

Fernando

Hi, Sanjiv,

those passes operate on the whole machine function. Each machine
function contains many basic blocks. If a program has many functions, the
register allocator will be called as many times, i.e it does not do
interprocedural allocation.

best,

Fernando

Thanks for replying back.
I am looking to write a regalloc pass that does interprocedural regalloc.
By constructing a Call Graph and keeping the registers in a single call chain different so that i can avoid spilling (saving) across function calls. What will be the right place to do so?

Sanjiv

Hi, again,

    I think you can do it in the same way that the other allocators have been coded, i.e extend RA, register the pass and so forth. I am not sure about the best way to pass information among a run of RegAlloc to the other, maybe the other guys in the list could suggest something. Yet, you can always dump it into a file, and read it again, everytime it is necessary. Remember that RegAlloc will be called once per function. Also, LLVM does very aggressive inlining of method calls, and this may cause the benefits of interprocedural register allocation to be very small, if any. There was one guy (google for Philip Brisk) who was working with interprocedural RA on SSA-form programs.

best,

Fernando

Thanks again. One more question here:
Since the regalloc works once per function, do I stil have access to
the Call graph?
Just saving information between regalloc passes for different
functions may not be enough for my case. I will need to maintain the
regalloc info of various passes in the call graph order.
Anyways thanks for your inputs. I will get back if I need to learn more.

Sanjiv

One possibility is to only do interprocedural allocation when IPO is used. In that case, all the functions are in a big bitcode file. You may also need to enhance the pass manager so you can do lowering, scheduling one function at a time and then someone gather all the MachineFunction's for the interprocedural allocation.

Evan