检查icmp指令中的sgt

Ada*_*ady 3 llvm

 %4 = icmp sgt i32 %2, %3
Run Code Online (Sandbox Code Playgroud)

对于上面的指令,我该如何检查icmp指令是否包含sgt或slt?

Eli*_*sky 7

直接回答您的问题是将此代码放在自定义中FunctionPass:

virtual bool runOnFunction(Function &F) {
    for (Function::iterator bb = F.begin(), bb_e = F.end(); bb != bb_e; ++bb) {
        for (BasicBlock::iterator ii = bb->begin(), ii_e = bb->end(); ii != ii_e; ++ii) {
            if (CmpInst *cmpInst = dyn_cast<CmpInst>(&*ii)) {
                handle_cmp(cmpInst);
            }
        }
    }
    return false;
}

void handle_cmp(CmpInst *cmpInst) {
    if (cmpInst->getPredicate() == CmpInst::ICMP_SGT) {
        errs() << "In the following instruction, SGT predicate\n";
        cmpInst->dump();
    }
}
Run Code Online (Sandbox Code Playgroud)

你最近似乎在问很多类似的问题,所以我想提出更一般的建议.

您在LLVM IR中看到的每条指令只是LLVM代码库中存在的指令类的文本表示.在这种情况下icmp表示ICmpInst,这是一个子类CmpInst.一旦你知道你正在处理CmpInst,只需通过读取头文件中的类声明就可以很容易地看到如何访问它的属性.例如,很明显该指令的"谓词"参数表示该sgt谓词和其他谓词.

但是你怎么知道要看哪个班级.这可以通过LLVM C++后端轻松完成,后端转储构建一些IR所需的等效C++代码.例如,鉴于这条IR:

  %0 = load i32* %argc.addr, align 4
  %cmp = icmp sgt i32 %0, 0
Run Code Online (Sandbox Code Playgroud)

它将转储:

  LoadInst* int32_19 = new LoadInst(ptr_argc_addr, "", false, label_entry_15);
  int32_19->setAlignment(4);
  ICmpInst* int1_cmp = new ICmpInst(*label_entry_15, ICmpInst::ICMP_SGT, int32_19, const_int32_8, "cmp");
  BranchInst::Create(label_if_then, label_if_else, int1_cmp, label_entry_15);
Run Code Online (Sandbox Code Playgroud)

所以你只需要从它看到你需要的东西ICmpInst,以及谓词就知道了ICMP_SGT.

要在.ll文件中的某些文本IR上运行C++后端,您只需执行以下操作:

llc -march=cpp -cppgen=program irfile.ll
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!