[LLVMdev] Problems with eraseFromParent()
Nick Lewycky
nicholas at mxc.ca
Sun Jun 20 20:40:03 PDT 2010
Alysson wrote:
> Hi LLVMers,
>
> I am working on my llvm school project optimization pass. It's
> relatively simple, and it tries to remove redundant bitcast instructions
> followed by load instructions. At first, I'm using as input a bytecode
> generated by a simple Java test program.
> I've already found the reduntant instructions by looking at it's
> CFG, and I also could implement the code to substitute their references,
> in order to eliminate all dependencies on these instructions (the number
> of their uses are changed to zero).
> The point is that when I finally attempt to remove the redundant
> unused instructions from the generated code, there is a seg fault error.
> To remove them, I'm using this function:
>
> void EraseInst(Instruction &I) {
> assert(I.use_empty() && "Cannot erase used instructions!");
> I.eraseFromParent();
> }
The problem is in how you use it:
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E;
I++) {
if (I->use_empty() && dyn_cast<LoadInst>(I)) {
errs() << "*****Instruction unused*****" << "\n";
errs() << *I << "\n";
EraseInst(*I);
}
}
Once you call EraseInst, you can't use it again in the I++ part of your
for loop. You'll have to restructure your loop so that you increment
before erasing your instruction, and erase the one you haven't
incremented yet.
Nick
>
> So please, if anyone could help me on this, i would be very grateful!
>
> PS: It's also following my pass and the bytecode used for tests.
>
> Thanks for the attention,
> Alysson
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
More information about the llvm-dev
mailing list