前言:我想指出这个has been asked的一种形式,但没有很多细节,也没有答案。我希望更详细的问题能够更加负责。
我想要做的是弄清楚我是否可以在同一个llvm :: MachineBasicBlock中切换两个llvm :: MachineInstr对象的顺序。我不想修改说明,我也不在乎在MachineBasicBlock之外移动指令。如果它很重要,我正在使用avr-llvm backend这是LLVM 3.7的一个分支。后端在这个时候是相当预先发布的,但是我将它用于研究,所以这不是一个真正的问题。
我的意图是在MachineFunctionPass
插入addILPOpts
中使用此代码,因此寄存器仍然是SSA格式。我有一些看起来像这样的东西:
bool runOnMachineFunction(MachineFunction &MF) override {
for (MachineFunction::iterator b = MF.begin(), be = MF.end(); b != be; ++b) {
MachineInstr *prev = NULL;
for (MachineBasicBlock::iterator i = b->begin(), ie = b->end(); i != ie; ++i) {
bool canSwap = false;
if (prev != NULL) {
canSwap = dependency(*prev, *i);
}
prev = i;
if (canSwap) errs() << "yup";
}
}
return false;
}
bool dependency(MachineInstr &MI0, MachineInstr &MI1) {
// somehow determine if MI1 depends on MI0 being executed first
return false;
}
我尝试过使用MachineRegisterInfo
,但如果我从MachineFunction
这样得到这个:
MachineRegisterInfo &MRI = MF.getRegInfo();
当我调用MRI.getVRegDef
时,一切似乎只返回NULL。我试图过早或过晚使用它吗?
Programmer's Manual中讨论的use-def和def-use链的概念似乎只适用于IR指令。机器指令是否有类似的数据结构?