Fix PR4645 which was fallout from the fix for PR4641.
authorDaniel Dunbar <daniel@zuster.org>
Wed, 29 Jul 2009 22:00:43 +0000 (22:00 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 29 Jul 2009 22:00:43 +0000 (22:00 +0000)
 - 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

lib/Transforms/Scalar/SimplifyLibCalls.cpp
test/Transforms/SimplifyLibCalls/2009-07-29-Exit2.ll [new file with mode: 0644]

index fef19f0ba0ea7ae8e176ed9619c75dc8bf7dc6c8..c421ee24068e99b6c18904829bc1fcd771b78bbc 100644 (file)
@@ -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 (file)
index 0000000..6fad326
--- /dev/null
@@ -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 ]             ; <i32> [#uses=1]
+       unreachable
+
+for.end:               ; preds = %for.cond20
+       %inc47 = add i32 %j.0, 1                ; <i32> [#uses=1]
+       br label %for.cond
+}
+
+declare void @exit(i32)