0
の定数とIRオペランドの比較:が、私はこのようになりますIR持つLLVM
%5=icmp eq i32 %4,0
を私はICMP命令の第2オペランドが0または何か他のものであるかどうかを確認したいです。私はgetOperand(1)
を使って、結果をValue *
形式で返します。どうすれば定数0と比較できますか?
の定数とIRオペランドの比較:が、私はこのようになりますIR持つLLVM
%5=icmp eq i32 %4,0
を私はICMP命令の第2オペランドが0または何か他のものであるかどうかを確認したいです。私はgetOperand(1)
を使って、結果をValue *
形式で返します。どうすれば定数0と比較できますか?
は、ここでは、これを見つけるために実行できるサンプルパスだ:それはある
具体的class DetectZeroValuePass : public FunctionPass {
public:
static char ID;
DetectZeroValuePass()
: FunctionPass(ID)
{}
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);
}
}
}
}
void handle_cmp(CmpInst *cmpInst) {
// Detect cmp instructions with the second operand being 0
if (cmpInst->getNumOperands() >= 2) {
Value *secondOperand = cmpInst->getOperand(1);
if (ConstantInt *CI = dyn_cast<ConstantInt>(secondOperand))
if (CI->isZero()) {
errs() << "In the following instruction, second operand is 0\n";
cmpInst->dump();
}
}
}
};
0のために 'val-> isZero()'、他の定数について少しトリッキー。 'match'を使うことをお勧めします。多くの例については、InstructionSimplify.cppを参照してください。 –
@ SK-logic: 'Value'は' isZero'を持っていません。これは 'ConstantInt'のメソッドです。詳細については、私の答えを参照してください –
@EliBenderskyはもちろん、ConstantIntへの動的キャストを成功させました。 –