如何在LLVM MachineBasicBlock中查找MachineInstr的数据依赖性?

时间:2015-03-07 23:38:11

标签: llvm compiler-optimization

前言:我想指出这个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指令。机器指令是否有类似的数据结构?

0 个答案:

没有答案