[llvm-dev] Error Calling eraseFromParent()

Björn Pettersson A via llvm-dev llvm-dev at lists.llvm.org
Tue Aug 7 14:34:05 PDT 2018


It looks quite dangerous to erase the instruction I inside the loop when iterating over all instructions in the function.
I guess it depends on how the range based iterator is implemented if that works or not.

I think that you, for example, can change the range based iteration

   for (auto &I : instructions(F))

into something like this

   for (inst_iterator It = inst_begin(&F), Ie = inst_end(&F); It != Ie;) {
      Instruction *I = &*(It++);
      ...
    }

That will make sure that you step the iterator before modifying the data structure you iterate over.

Regards,
Björn
________________________________________
From: llvm-dev <llvm-dev-bounces at lists.llvm.org> on behalf of Ahmad Nouralizadeh via llvm-dev <llvm-dev at lists.llvm.org>
Sent: Tuesday, August 7, 2018 22:26
To: paul.robinson at sony.com
Cc: llvm-dev at lists.llvm.org
Subject: Re: [llvm-dev] Error Calling eraseFromParent()

The code is really simple. But I can not the reason for the segmentation fault. I only know that the eraseFromParent() function leads to it. The whole code is:
...
bool runOnFunction(Function &F) override {

for (auto &I : instructions(F)) {

if (auto* op = dyn_cast<BinaryOperator>(&I)) {
IRBuilder<> builder(op);

Value* lhs = op->getOperand(0);
Value* rhs = op->getOperand(1);
Value* mul = builder.CreateMul(lhs, rhs);

for (auto& U : op->uses()) {
  User* user = U.getUser();
  user->setOperand(U.getOperandNo(), mul);
}

I.eraseFromParent();
    }

}
...
And I think that the code worked well with LLVM-3.6.0 that I tested one year ago. Now, I use LLVM-6.0.0.
Regards.


More information about the llvm-dev mailing list