llvm «replaceinstwithvalue» не работает

0

Я новичок llvm.

Я пытаюсь написать llvm pass для оптимизации для алгебраических тождеств в функции (например, если моя функция имеет инструкцию a = b * 0, мой пропуск должен заменить все последующие применения "a" с помощью 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) {
    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

Теги:
optimization
compiler-construction
llvm

1 ответ

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

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню