aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2009-07-29 22:00:43 +0000
committerDaniel Dunbar <daniel@zuster.org>2009-07-29 22:00:43 +0000
commit880eb1d56b287742f70951a6e8dd1f167748f9da (patch)
treedd914bb1a66d2c1f37d357763bd0ecc746db572b /lib/Transforms
parent3d3bdf43f3e1ea6646a8b9af59377a3f7ff5d220 (diff)
downloadexternal_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.cpp23
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;