Josh Sharp via llvm-dev
2019-Feb-17 02:38 UTC
[llvm-dev] New to LLVM. Need help getting available register
Is it possible to get a virtual register and then use that to create a real register? I've seen it done in unittests/CodeGen/MachineInstrTest.cpp like this: unsigned VirtualDef1 = -42; VD1VU->addOperand(*MF, MachineOperand::CreateReg(VirtualDef1, /*isDef*/ true)); But when I do that in my code I get an assertion so I wasn't sure if it's legal or not. Thanks. ________________________________ From: David Greene <dag at cray.com> Sent: Wednesday, January 2, 2019 9:23 AM To: m m Cc: via llvm-dev Subject: Re: [llvm-dev] New to LLVM. Need help getting available register m m via llvm-dev <llvm-dev at lists.llvm.org> writes:> I'm new to LLVM. I'd like to know if there is a method I can call > whenever I need any available CPU register.Take a look at RegisterScavenging. Of course, this only works after register allocation. Before register allocation you'd just create a new virtual register. -David -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190217/de1b5b70/attachment.html>
David Greene via llvm-dev
2019-Feb-19 01:22 UTC
[llvm-dev] New to LLVM. Need help getting available register
It would help if you can describe in more detail what you are trying to do. In which phase of the compiler is this being done? What is your ultimate goal? I would not look to unit tests as good examples of how to do things. They are specifically designed to pinpoint small bits of functionality and often rare corner cases. It's possible the bit of code you're looking at is actually testing that the assertion triggers. -David ________________________________________ From: Josh Sharp <mm92126 at hotmail.com> Sent: Saturday, February 16, 2019 8:38:53 PM To: David Greene Cc: via llvm-dev Subject: Re: [llvm-dev] New to LLVM. Need help getting available register Is it possible to get a virtual register and then use that to create a real register? I've seen it done in unittests/CodeGen/MachineInstrTest.cpp like this: unsigned VirtualDef1 = -42; VD1VU->addOperand(*MF, MachineOperand::CreateReg(VirtualDef1, /*isDef*/ true)); But when I do that in my code I get an assertion so I wasn't sure if it's legal or not. Thanks. ________________________________ From: David Greene <dag at cray.com> Sent: Wednesday, January 2, 2019 9:23 AM To: m m Cc: via llvm-dev Subject: Re: [llvm-dev] New to LLVM. Need help getting available register m m via llvm-dev <llvm-dev at lists.llvm.org> writes:> I'm new to LLVM. I'd like to know if there is a method I can call > whenever I need any available CPU register.Take a look at RegisterScavenging. Of course, this only works after register allocation. Before register allocation you'd just create a new virtual register. -David
Josh Sharp via llvm-dev
2019-Feb-19 02:21 UTC
[llvm-dev] New to LLVM. Need help getting available register
David, It is done inside eliminateFrameIndex(). I'm trying to move the stack offset to a register by using my custom MOVRI_P pseudo instruction this way: unsigned AR = MF.getRegInfo().createVirtualRegister(XXX::RegClass); BuildMI(MB,II,dl, TII.get(XXX::MOVRI_P), AR).addImm(Offset); (When I print AR, I get 2147483648 = 0x80000000) Then, in expandPostRAPseudo(), I replace it with the real MOVRI instruction MachineOperand op_0 = MI.getOperand(0); MachineOperand op_1 = MI.getOperand(1); BuildMI(MB,MBI,dl, get(XXX::MOVRI)).add(op_0).add(op_1); At this point op_1_0.getReg() is 2147483648 and op_1_1.getImm() is correct When I execute the program it says: Assertion `RegNo && RegNo < 37 && "Invalid register number!"' failed. Thanks ________________________________ From: David Greene <dag at cray.com> Sent: Monday, February 18, 2019 5:22 PM To: Josh Sharp Cc: via llvm-dev Subject: Re: [llvm-dev] New to LLVM. Need help getting available register It would help if you can describe in more detail what you are trying to do. In which phase of the compiler is this being done? What is your ultimate goal? I would not look to unit tests as good examples of how to do things. They are specifically designed to pinpoint small bits of functionality and often rare corner cases. It's possible the bit of code you're looking at is actually testing that the assertion triggers. -David ________________________________________ From: Josh Sharp <mm92126 at hotmail.com> Sent: Saturday, February 16, 2019 8:38:53 PM To: David Greene Cc: via llvm-dev Subject: Re: [llvm-dev] New to LLVM. Need help getting available register Is it possible to get a virtual register and then use that to create a real register? I've seen it done in unittests/CodeGen/MachineInstrTest.cpp like this: unsigned VirtualDef1 = -42; VD1VU->addOperand(*MF, MachineOperand::CreateReg(VirtualDef1, /*isDef*/ true)); But when I do that in my code I get an assertion so I wasn't sure if it's legal or not. Thanks. ________________________________ From: David Greene <dag at cray.com> Sent: Wednesday, January 2, 2019 9:23 AM To: m m Cc: via llvm-dev Subject: Re: [llvm-dev] New to LLVM. Need help getting available register m m via llvm-dev <llvm-dev at lists.llvm.org> writes:> I'm new to LLVM. I'd like to know if there is a method I can call > whenever I need any available CPU register.Take a look at RegisterScavenging. Of course, this only works after register allocation. Before register allocation you'd just create a new virtual register. -David -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190219/34ddf3a5/attachment-0001.html>