%4 = icmp sgt i32 %2, %3
对于上述指令,如何检查icmp指令是否包含sgt或slt?
答案 0 :(得分: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();
}
}
你最近似乎在问很多类似的问题,所以我想提出更一般的建议。
您在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
它会转储:
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
希望这有帮助!
答案 1 :(得分:0)
以下是您问题的解决方案:
ICmpInst *ICC=dyn_cast<ICmpInst>(inst);
llvm::CmpInst::Predicate pr=ICC->getSignedPredicate();
switch(pr){
case CmpInst::ICMP_SGT: errs()<<"------>SGT\n"; break;
case CmpInst::ICMP_SLT: errs()<<"------>SLT\n"; break;
case CmpInst::ICMP_SGE: errs()<<"------>SGE\n"; break;
case CmpInst::ICMP_SLE: errs()<<"------>SLE\n"; break;
}
假设您有“inst”指向该指令的指令指针(%4 = icmp sgt i32%2,%3)。在对ICC进行dyanamic cast之后,ICC是ICmpInst类的一个实例。然后如上所述调用getSignedPredicate()将返回谓词。在此基础上有切换案例。希望它对你有用。