[LLVMdev] [Query] Programming Register Allocation
Jeff Kunkel
jdkunk3 at gmail.com
Sun Aug 29 16:54:32 PDT 2010
I solve my own problem.
mbbi->getRegInfo()->getRegClass( reg )
will return the register class.
Thanks,
Jeff Kunkel
On Sun, Aug 29, 2010 at 11:43 AM, Jeff Kunkel <jdkunk3 at gmail.com> wrote:
> Thanks for the information.
>
> I still don't know how do I partition registers into different classes from
> the virtual registers? For instance, I have the function who which iterates
> over the instructions, but I don't know how to write the function which
> returns the different register class.
>
> void RAOptimal::Gather(MachineFunction &Fn) {
> // Gather just iterates over the blocks, basicblocks, ect. until
> // it finds the MachineOperand. When it finds the operand, it
> // checks to see if the operand is a register, if so, it parses
> // the register to find which set it is suppose to be in.
>
> // time is an artificial time used to denote whether an operand came
> // before or after another operand.
> unsigned time;
> time = 0; // Initialize time.
>
> // For each block:
> for( MachineFunction::iterator mfi=Fn.begin(), mfe=Fn.end(); mfi !=
> mfe; ++mfi ) {
> // for each byte code line:
> for( MachineBasicBlock::iterator mbbi = mfi->begin(), mbbe =
> mfi->end(); mbbi != mbbe; ++mbbi ) {
> // for each variable used:
> for( int opi=0, ope=mbbi->getNumOperands(); opi != ope; ++opi )
> {
> // Get the variable
> const MachineOperand mop = mbbi->getOperand( opi );
> // If it is a register, notify the class.
> if( mop.isReg() ) {
> // DEBUG( dbgs() << "Found the register " << mop );
> if( mop.isDef() || mop.isUse() ) {
> // The instruction has defined the register.
> // Or, the instruction uses the register.
> unsigned reg = mop.getReg();
> * unsigned set = who(Fn, mbbi, mop, reg);*
> RegisterSets[ set ].Notify( reg, time, mbbi );
> // Increment time after each Notify to keep the
> reg's times from
> // overlapping.
> ++time;
> } else {
> assert( 0 && "The register is always defining or
> used." );
> }
> }
> }
> }
> }
> }
>
> Thanks,
> Jeff Kunkel
>
> On Sun, Aug 29, 2010 at 8:45 AM, Gergö Barany <gergo at complang.tuwien.ac.at
> > wrote:
>
>> On Sat, Aug 28, 2010 at 16:20:42 -0400, Jeff Kunkel wrote:
>> > What I need to know is how to access the machine register classes. Also,
>> I
>> > need to know which virtual register is to be mapped into each specific
>> > register class. I assume there is type information on the registers. I
>> need
>> > to know how to access it.
>>
>> MachineRegisterInfo::getRegClass will give you the TargetRegisterClass for
>> a
>> given virtual register. Each TargetRegisterClass has an "allocation order"
>> that enumerates all physical registers valid for that class.
>>
>> > And a afterthought, does LLVM place casts into
>> > different virtual registers, or do I need to include casting of floats
>> to
>> > integers or vice versa when I see ADD i32 float i32?
>>
>> The instruction selector creates all necessary conversion instructions.
>>
>> --
>> Gergö Barany, research assistant
>> gergo at complang.tuwien.ac.at
>> Institute of Computer Languages
>> http://www.complang.tuwien.ac.at/gergo/
>> Vienna University of Technology Tel:
>> +43-1-58801-58522
>> Argentinierstrasse 8/E185, 1040 Wien, Austria Fax:
>> +43-1-58801-18598
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100829/cea3f465/attachment.html>
More information about the llvm-dev
mailing list