diff options
author | Bill Wendling <isanbard@gmail.com> | 2011-08-31 20:55:20 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2011-08-31 20:55:20 +0000 |
commit | 4f8aaa0928caf36d7982534748c8390c5186d534 (patch) | |
tree | 259a57fb8f02c4ec1e4b8bea992f3c82785674e8 /lib/Transforms/Scalar/SCCP.cpp | |
parent | 721cb1fde07423fd1905338d443172a8028ad634 (diff) | |
download | llvm-4f8aaa0928caf36d7982534748c8390c5186d534.tar.gz llvm-4f8aaa0928caf36d7982534748c8390c5186d534.tar.bz2 llvm-4f8aaa0928caf36d7982534748c8390c5186d534.tar.xz |
Make sure we aren't deleting the landingpad instruction.
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
Diffstat (limited to 'lib/Transforms/Scalar/SCCP.cpp')
-rw-r--r-- | lib/Transforms/Scalar/SCCP.cpp | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/lib/Transforms/Scalar/SCCP.cpp b/lib/Transforms/Scalar/SCCP.cpp index cfe750c5fa..3d52afa2e1 100644 --- a/lib/Transforms/Scalar/SCCP.cpp +++ b/lib/Transforms/Scalar/SCCP.cpp @@ -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; } } |