I have the followint LLVM IR file
%1 = load i32* %i, align 4
%2 = load i32* %j, align 4
%3 = icmp sgt i32 %1, %2
br i1 %3, label %4, label %6
; <label>:4 ; preds = %0
%5 = load i32* %i, align 4
store i32 %5, i32* %k, align 4
br label %6
; <label>:6 ; preds = %5, %0
ret i32 0
In it I am first loading vairable "i" in %1 and variable "j" in %2 then I am comparing the greater than condition that is (i>j). Based on that there is branch either to label 4 or label 6. My problem is that there are two load instruction for variable "i" one in first basic block and other in 2nd basic block. Here I want to remove 2nd load instruction. For it I am doing it as when I reach to 2nd load instruction for variable "i" I am replacing all uses of 2nd instruction by first instruction then I am erasing the current instruction i.e. 2nd. Here I am unable to set instruction iterator pointer. I do not want to set for next instruction(store i32 %5, i32* %k, align 4). Is there a other way? If you know please let me know.
If I understand you correctly, all you want is just to erase an instruction and keep iterating over the code. If that's right, take a look at this example from the DeadInstElimintation
pass (which lives in lib/Transforms/Scalar/DCE.cpp
):
virtual bool runOnBasicBlock(BasicBlock &BB) {
bool Changed = false;
for (BasicBlock::iterator DI = BB.begin(); DI != BB.end(); ) {
Instruction *Inst = DI++;
if (isInstructionTriviallyDead(Inst)) {
Inst->eraseFromParent();
Changed = true;
++DIEEliminated;
}
}
return Changed;
}
The interesting thing to note is how the iterator is incremented. The DI++
is not done inside the last clause of the for
, but rather separately, with the current DI
assigned to Inst
. This ensures that even if you delete Inst
, DI
already points to the next instruction so the loop will keep running over the next instructions.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With