From: Daniel Dunbar Date: Wed, 29 Jul 2009 22:00:43 +0000 (+0000) Subject: Fix PR4645 which was fallout from the fix for PR4641. X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=473955f439b44eed4c5230ad6f9d51bcb62a3b21;p=oota-llvm.git 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 --- diff --git a/lib/Transforms/Scalar/SimplifyLibCalls.cpp b/lib/Transforms/Scalar/SimplifyLibCalls.cpp index fef19f0ba0e..c421ee24068 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; diff --git a/test/Transforms/SimplifyLibCalls/2009-07-29-Exit2.ll b/test/Transforms/SimplifyLibCalls/2009-07-29-Exit2.ll new file mode 100644 index 00000000000..6fad3260880 --- /dev/null +++ b/test/Transforms/SimplifyLibCalls/2009-07-29-Exit2.ll @@ -0,0 +1,24 @@ +; RUN: llvm-as < %s | opt -simplify-libcalls -disable-output +; PR4645 + +define i32 @main() { +entry: + br label %if.then + +lor.lhs.false: ; preds = %while.body + br i1 undef, label %if.then, label %for.cond + +if.then: ; preds = %lor.lhs.false, %while.body + call void @exit(i32 1) + br label %for.cond + +for.cond: ; preds = %for.end, %if.then, %lor.lhs.false + %j.0 = phi i32 [ %inc47, %for.end ], [ 0, %if.then ], [ 0, %lor.lhs.false ] ; [#uses=1] + unreachable + +for.end: ; preds = %for.cond20 + %inc47 = add i32 %j.0, 1 ; [#uses=1] + br label %for.cond +} + +declare void @exit(i32)