I'm trying to write an llvm pass to replace all BinaryOperator instructions by a multiplication, the problem is that only the 1st instruction is replaced:
virtual bool runOnFunction(Function &F) {
for (auto &B : F) {
for (BasicBlock::iterator DI = B.begin(); DI != B.end(); ) {
Instruction *Inst = DI++;
if (auto *op = dyn_cast<BinaryOperator>(&*Inst)) {
// Insert at the point where the instruction `op` appears.
IRBuilder<> builder(op);
// Make a multiply with the same operands as `op`.
Value *lhs = op->getOperand(0);
Value *rhs = op->getOperand(1);
Value *mul = builder.CreateMul(lhs, rhs);
// Everywhere the old instruction was used as an operand, use our
// new multiply instruction instead.
for (auto &U : op->uses()) {
User *user = U.getUser(); // A User is anything with operands.
user->setOperand(U.getOperandNo(), mul);
}
// We modified the code.
return true;
}
}
}
return false;
}
Aucun commentaire:
Enregistrer un commentaire