我如何在 LLVM 中保留寄存器?

How can I reserve registers in LLVM?

我正在尝试实现一个特殊的编译器级别的 LLVM pass,它必须在 ARM 微架构中的可用 32 个 GPR 中保留 20 个寄存器,以便我将在这些保留的寄存器上执行我的实验。我打算在 IR 级别执行此操作。可能吗?

您可能想要编辑 RegisterInfo.td 文件。我没有具体完成您想要做的事情,但请查看 Target.td 以获取一些提示。 IsAllocatable 看起来很有前途,或者可能会删除您不希望 LLVM 使用的寄存器。

肯定不会是IR级的,因为IR寄存器是虚拟的,是无限的。您可以使用 XXXRegisterInfo::getReservedRegs() 将寄存器标记为保留。

BitVector XXXRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
  BitVector Reserved(getNumRegs());

  Reserved.set(XXX::REGX);

  return Reserved;
}