Как найти цепочки def-use на уровне машины в бэкэнде LLVM - PullRequest
0 голосов
/ 10 октября 2019

Я новичок в работе с бэкэндом LLVM. У меня есть проход X86, на котором я отмечаю некоторые машинные инструкции, а затем хочу найти зависимые от данных инструкции отмеченных инструкций. Под зависимостью от данных я подразумеваю пользователей инструкций (например, цепочки def-use). Для этого на уровне IR я использовал такой код:

for (auto it = marked_instructions.begin(), eit = marked_instructions.end(); it != eit; it++)
{
    for (User *U : (*it)->users())
    {
        if (Instruction *Inst = dyn_cast<Instruction>(U))
        {
            dependent_instructions.insert(Inst);
        }
    }
}

Теперь я хочу сделать то же самое на бэкэнде и с MachineInstr s. Кроме того, мой пропуск в настоящее время имеет место после распределения регистра. Тем не менее, нет никаких ограничений для выполнения этого перед распределением регистров, если легче найти цепочки def-use до распределения регистров.

Спасибо

1 Ответ

0 голосов
/ 15 октября 2019

Я думаю, может быть, MachineRegisterInfo::getRegUseDefListHead(RegNo) может удовлетворить ваши потребности.

например,

Для некоторых MachineInstr *MI:

    for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
         const MachineOperand &MO = MI->getOperand(i);
         if (MO.isReg() && MO.isDef()) {
         unsigned Reg = MO.getReg();
         MachineOperand * mopr = getRegUseDefListHead(Reg);
         ....
    .... 

Подробнее см. Lang-ref-llvm.

...