gpt4 book ai didi

llvm - 检查 icmp 指令中的 sgt

转载 作者:行者123 更新时间:2023-12-05 00:35:42 46 4
gpt4 key购买 nike

 %4 = icmp sgt i32 %2, %3

对于上面的指令,如何判断icmp指令中是否包含sgt或slt?

最佳答案

您问题的直接答案是将此代码放在自定义 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();
}
}

你最近好像问了很多类似的问题,所以我想给出一个更笼统的建议。

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

但是你怎么知道要看哪个类。这可以通过 LLVM C++ 后端轻松完成,它转储构建一些 IR 所需的等效 C++ 代码。例如,给定这段 IR:

  %0 = load i32* %argc.addr, align 4
%cmp = icmp sgt i32 %0, 0

它将转储:

  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);

因此您仅通过查看它就知道您需要 ICmpInst,并且谓词是 ICMP_SGT

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

llc -march=cpp -cppgen=program irfile.ll

希望这对您有所帮助!

关于llvm - 检查 icmp 指令中的 sgt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9338816/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com