Make sure we aren't deleting the landingpad instruction.
authorBill Wendling <isanbard@gmail.com>
Wed, 31 Aug 2011 20:55:20 +0000 (20:55 +0000)
committerBill Wendling <isanbard@gmail.com>
Wed, 31 Aug 2011 20:55:20 +0000 (20:55 +0000)
The landingpad instruction is required in the landing pad block. Because we're
not deleting terminating instructions, the invoke may still jump to here (see
Transforms/SCCP/2004-11-16-DeadInvoke.ll). Remove all uses of the landingpad
instruction, but keep it around until code-gen can remove the basic block.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@138890 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/SCCP.cpp

index cfe750c5fa273a4aac0a357210664aec99072177..3d52afa2e10f5dabad988b20f31c9bd80dd4951b 100644 (file)
@@ -1681,15 +1681,31 @@ FunctionPass *llvm::createSCCPPass() {
 static void DeleteInstructionInBlock(BasicBlock *BB) {
   DEBUG(dbgs() << "  BasicBlock Dead:" << *BB);
   ++NumDeadBlocks;
-  
+
+  // Check to see if there are non-terminating instructions to delete.
+  if (isa<TerminatorInst>(BB->begin()))
+    return;
+
   // Delete the instructions backwards, as it has a reduced likelihood of
   // having to update as many def-use and use-def chains.
-  while (!isa<TerminatorInst>(BB->begin())) {
-    Instruction *I = --BasicBlock::iterator(BB->getTerminator());
-    
+  std::vector<Instruction*> WorkList;
+  WorkList.reserve(BB->size());
+  BasicBlock::iterator I = --BasicBlock::iterator(BB->getTerminator());
+
+  while (true) {
     if (!I->use_empty())
       I->replaceAllUsesWith(UndefValue::get(I->getType()));
-    BB->getInstList().erase(I);
+    WorkList.push_back(I);
+    if (I == BB->begin())
+      break;
+    --I;
+  }
+
+  for (std::vector<Instruction*>::iterator
+         II = WorkList.begin(), IE = WorkList.end(); II != IE; ++II) {
+    if (isa<LandingPadInst>(*II))
+      continue;
+    BB->getInstList().erase(*II);
     ++NumInstRemoved;
   }
 }