如何在LLVM机器函数过程中创建新的虚拟寄存器?

如何在LLVM机器函数过程中创建新的虚拟寄存器?,llvm,Llvm,我正在创建一个LLVM MachineFunctionPass。这是预注册分配通行证。我想在某个点添加一个新的MachineInstr(我创建的)。我使用BuildMI()创建新指令,然后使用MachineInstr::addOperand()填充它。我想添加一个新的虚拟寄存器作为操作数之一。最好的方法是什么 我已经读到可以使用MachineRegisterInfo::createVirtualRegister(),但它需要一个TargetRegisterClass参数,我不知道如何获得它。我没

我正在创建一个LLVM MachineFunctionPass。这是预注册分配通行证。我想在某个点添加一个新的MachineInstr(我创建的)。我使用BuildMI()创建新指令,然后使用MachineInstr::addOperand()填充它。我想添加一个新的虚拟寄存器作为操作数之一。最好的方法是什么


我已经读到可以使用MachineRegisterInfo::createVirtualRegister(),但它需要一个TargetRegisterClass参数,我不知道如何获得它。我没能找到文件。任何帮助都将不胜感激

有很多方法可以做到这一点。最有用的两个方面是:

  • 询问您的
    机器注册信息
    有关您已经拥有的某些现有寄存器的类。通过调用
    getRegInfo
    方法,可以从
    MachineFunction
    获取
    MachineRegisterInfo
    MRI
    )。然后,使用
    MachineRegisterInfo::getRegClass
  • 询问您的
    TargetLowering::getRegClassFor
    。您可以给它一个
    MVT
    。有关更多详细信息,请参见
    include/llvm/Target/TargetLowering.h

  • 通过LLVM源代码对上述方法进行Grepping应该可以为您提供大量的使用示例。

    谢谢;这很有帮助。但是,在这种情况下,我没有现有的注册表。关于TargetLowering::getRegClassFor(),我是否正确地认为需要给它一个通过EVT::getIntegerVT()构造的EVT?(这是针对128位寄存器的;我希望它在寄存器分配后最终变成类似于xmm0的东西。)我再一次有点困惑于如何获取要传递给getIntegerVT()的参数。它需要一个LLVMContext,我不知道从何处获取。我想知道这样做是否合理以获取TargetRegisterClass:MachineFunction::getTarget().getInstrInfo()->getRegClass(myMachineInstr->getDesc(),0,MachineFunction::getTarget().getRegisterInfo())@user2755615:可以从模块获取上下文,函数等。在许多情况下,您还具有全局上下文。在LLVM代码库中Grep for
    getContext