【问题标题】:How to find def-use chains at the machine-level in LLVM backend如何在 LLVM 后端的机器级别找到 def-use 链
【发布时间】:2021-05-19 17:13:41
【问题描述】:

我是 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);
        }
    }
}

现在,我想在后端和MachineInstrs 上做同样的事情。另外,我的通行证目前是在寄存器分配之后进行的。但是,如果在寄存器分配之前更容易找到 def-use 链,那么在寄存器分配之前就没有限制。

谢谢

【问题讨论】:

    标签: c++ x86 llvm


    【解决方案1】:

    我认为,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。

    【讨论】:

    • 我使用过这种方法,但它不起作用。是否适用于同一个基本块中的 def-use 链?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多