2012-02-14 30 views
0

の定数とIRオペランドの比較:が、私はこのようになりますIR持つLLVM

%5=icmp eq i32 %4,0 

を私はICMP命令の第2オペランドが0または何か他のものであるかどうかを確認したいです。私はgetOperand(1)を使って、結果をValue *形式で返します。どうすれば定数0と比較できますか?

+0

0のために 'val-> isZero()'、他の定数について少しトリッキー。 'match'を使うことをお勧めします。多くの例については、InstructionSimplify.cppを参照してください。 –

+0

@ SK-logic: 'Value'は' isZero'を持っていません。これは 'ConstantInt'のメソッドです。詳細については、私の答えを参照してください –

+0

@EliBenderskyはもちろん、ConstantIntへの動的キャストを成功させました。 –

答えて

3

は、ここでは、これを見つけるために実行できるサンプルパスだ:それはある

具体的
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(); 
       } 
     } 
    } 
}; 
関連する問題