llvm“replaceinstwithvalue”不起作用

时间:2014-02-01 06:09:07

标签: c++ optimization compiler-construction llvm

我是一个新手。

我正在尝试编写一个llvm传递以优化函数中的代数身份(例如,如果我的函数有一个指令a = b * 0,我的传递应该用“a”替换以下所有使用0)。< / p>

所以,我的传递如下: -

...

for (Function::iterator f_it = F.begin(), f_ite = F.end(); f_it != f_ite; ++f_it) {
  for(BasicBlock::iterator b_it = f_it->begin(), b_ite = f_it->end(); b_it != b_ite; ++b_it) {
    if(op->getOpcode() == Instruction::Mul) {
      if(ConstantInt *CI_F = dyn_cast<ConstantInt>(&*b_it->getOperand(0))) {
        if(CI_F->isZero()) {
          firstop_zero = 1;
        }
      }
      if(ConstantInt *CI_S = dyn_cast<ConstantInt>(&*b_it->getOperand(1))) {
        if(CI_S->isZero()) {
          secop_zero = 1;
        }
      }
      if(first_zero || second_zero) {   
        errs()<<"found zero operand\n";  
        ReplaceInstWithValue(b_it->getParent()->getInstList(),b_it,(first_zero?(&*b_it->getOperand(1)):(&*b_it->getOperand(0))));
      }
    }
  }
}

我可以看到我的评论“发现零操作数在std-err上打印出来,但是我无法在最终的.bc反汇编中看到替换。

我在这里缺少什么?真诚地感谢任何帮助。

非常感谢! Praveena

1 个答案:

答案 0 :(得分:0)

尝试

for (Function::iterator f_it = F.begin(), f_ite = F.end(); f_it != f_ite; ++f_it) {
for(BasicBlock::iterator b_it = f_it->begin(), b_ite = f_it->end(); b_it != b_ite; ++b_it) {
 Instruction *I = *b_it;
 Value *Zeroval;
if(op->getOpcode() == Instruction::Mul) {
  if(ConstantInt *CI_F = dyn_cast<ConstantInt>(&*b_it->getOperand(0))) {
    if(CI_F->isZero()) {
      firstop_zero = 1;
      Zeroval = CI_F;
    }
  }
  if(ConstantInt *CI_S = dyn_cast<ConstantInt>(&*b_it->getOperand(1))) {
    if(CI_S->isZero()) {
      secop_zero = 1;
      ZeroVal = CI_S;
    }
  }
  if(first_zero || second_zero) {   
    errs()<<"found zero operand\n";  
    I->ReplaceAlluseswith(ZeroVal);
  }
}
 }

}