From 8c99f6e1ba894ee1b10fdbc290b8834ef3a6550c Mon Sep 17 00:00:00 2001 From: Martin Nowack Date: Tue, 6 Aug 2019 10:16:42 +0100 Subject: Update basic block iterator after deleting instruction; add test case --- lib/Module/IntrinsicCleaner.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'lib/Module') diff --git a/lib/Module/IntrinsicCleaner.cpp b/lib/Module/IntrinsicCleaner.cpp index 19683ab4..92107f4f 100644 --- a/lib/Module/IntrinsicCleaner.cpp +++ b/lib/Module/IntrinsicCleaner.cpp @@ -205,14 +205,15 @@ bool IntrinsicCleanerPass::runOnBasicBlock(BasicBlock &b, Module &M) { Builder.CreateCall(F); Builder.CreateUnreachable(); - ii->eraseFromParent(); - - //check if the instruction after the one we just replaced is not the end of the basic block - //and if it is not (i.e. it is a valid instruction), delete it and all remaining - //because the cleaner just introduced a terminating instruction (unreachable) - //otherwise llvm will assert in Verifier::visitTerminatorInstr - while(i != ie){ // i was already incremented above. - (i++)->eraseFromParent(); + i = ii->eraseFromParent(); + + // check if the instruction after the one we just replaced is not the + // end of the basic block and if it is not (i.e. it is a valid + // instruction), delete it and all remaining because the cleaner just + // introduced a terminating instruction (unreachable) otherwise llvm will + // assert in Verifier::visitTerminatorInstr + while (i != ie) { // i was already incremented above. + i = i->eraseFromParent(); } dirty = true; -- cgit 1.4.1