diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-07-29 22:00:43 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-07-29 22:00:43 +0000 |
commit | 880eb1d56b287742f70951a6e8dd1f167748f9da (patch) | |
tree | dd914bb1a66d2c1f37d357763bd0ecc746db572b /lib/Transforms | |
parent | 3d3bdf43f3e1ea6646a8b9af59377a3f7ff5d220 (diff) | |
download | external_llvm-880eb1d56b287742f70951a6e8dd1f167748f9da.zip external_llvm-880eb1d56b287742f70951a6e8dd1f167748f9da.tar.gz external_llvm-880eb1d56b287742f70951a6e8dd1f167748f9da.tar.bz2 |
Fix PR4645 which was fallout from the fix for PR4641.
- Call RAUW to delete all instructions (this is a patch from Nick Lewycky).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77512 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/Scalar/SimplifyLibCalls.cpp | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/lib/Transforms/Scalar/SimplifyLibCalls.cpp b/lib/Transforms/Scalar/SimplifyLibCalls.cpp index fef19f0..c421ee2 100644 --- a/lib/Transforms/Scalar/SimplifyLibCalls.cpp +++ b/lib/Transforms/Scalar/SimplifyLibCalls.cpp @@ -29,6 +29,7 @@ #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/Statistic.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" @@ -518,18 +519,24 @@ struct VISIBILITY_HIDDEN ExitOpt : public LibCallOptimization { return 0; TerminatorInst *OldTI = CI->getParent()->getTerminator(); - + // Drop all successor phi node entries. for (unsigned i = 0, e = OldTI->getNumSuccessors(); i != e; ++i) OldTI->getSuccessor(i)->removePredecessor(CI->getParent()); - - // Split the basic block after the call to exit. - BasicBlock::iterator FirstDead = CI; ++FirstDead; - CI->getParent()->splitBasicBlock(FirstDead); - B.SetInsertPoint(B.GetInsertBlock()); - // Remove the branch that splitBB created and insert a return instead. - CI->getParent()->getTerminator()->eraseFromParent(); + // Remove all instructions after the exit. + BasicBlock::iterator Dead = CI, E = OldTI; ++Dead; + while (Dead != E) { + BasicBlock::iterator Next = next(Dead); + if (Dead->getType() != Type::VoidTy) + Dead->replaceAllUsesWith(UndefValue::get(Dead->getType())); + Dead->eraseFromParent(); + Dead = Next; + } + + // Insert a return instruction. + OldTI->eraseFromParent(); + B.SetInsertPoint(B.GetInsertBlock()); B.CreateRet(CI->getOperand(1)); return CI; |