Start using the nicer terminator auto-insertion API
[oota-llvm.git] / lib / Transforms / Utils / InlineFunction.cpp
index 592babc1f930242e6625fa248541f2bddd7ae2da..a0fc9bf1cff128169fba0ebb35408afcc6c133ce 100644 (file)
@@ -1,4 +1,11 @@
 //===- InlineFunction.cpp - Code to perform function inlining -------------===//
+// 
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+// 
+//===----------------------------------------------------------------------===//
 //
 // This file implements inlining of a function into a call site, resolving
 // parameters and the return value as appropriate.
@@ -17,6 +24,8 @@
 #include "llvm/Support/CallSite.h"
 #include "llvm/Transforms/Utils/Local.h"
 
+namespace llvm {
+
 bool InlineFunction(CallInst *CI) { return InlineFunction(CallSite(CI)); }
 bool InlineFunction(InvokeInst *II) { return InlineFunction(CallSite(II)); }
 
@@ -53,6 +62,15 @@ bool InlineFunction(CallSite CS) {
   if (InvokeInst *II = dyn_cast<InvokeInst>(TheCall)) {
     InvokeDest = II->getExceptionalDest();
 
+    // If there are PHI nodes in the exceptional destination block, we need to
+    // keep track of which values came into them from this invoke, then remove
+    // the entry for this block.
+    for (BasicBlock::iterator I = InvokeDest->begin();
+         PHINode *PN = dyn_cast<PHINode>(I); ++I) {
+      // Save the value to use for this edge...
+      InvokeDestPHIValues.push_back(PN->getIncomingValueForBlock(OrigBB));
+    }
+
     // Add an unconditional branch to make this look like the CallInst case...
     BranchInst *NewBr = new BranchInst(II->getNormalDest(), TheCall);
 
@@ -62,15 +80,6 @@ bool InlineFunction(CallSite CS) {
     AfterCallBB = OrigBB->splitBasicBlock(NewBr,
                                           CalledFunc->getName()+".entry");
 
-    // If there are PHI nodes in the exceptional destination block, we need to
-    // keep track of which values came into them from this invoke, then remove
-    // the entry for this block.
-    for (BasicBlock::iterator I = InvokeDest->begin();
-         PHINode *PN = dyn_cast<PHINode>(I); ++I) {
-      // Save the value to use for this edge...
-      InvokeDestPHIValues.push_back(PN->getIncomingValueForBlock(AfterCallBB));
-    }
-
     // Remove (unlink) the InvokeInst from the function...
     OrigBB->getInstList().remove(TheCall);
 
@@ -229,10 +238,17 @@ bool InlineFunction(CallSite CS) {
         // invoke site.  Once this happens, we know that the unwind would cause
         // a control transfer to the invoke exception destination, so we can
         // transform it into a direct branch to the exception destination.
-        BranchInst *BI = new BranchInst(InvokeDest, UI);
+        new BranchInst(InvokeDest, UI);
 
         // Delete the unwind instruction!
         UI->getParent()->getInstList().pop_back();
+
+        // Update any PHI nodes in the exceptional block to indicate that
+        // there is now a new entry in them.
+        unsigned i = 0;
+        for (BasicBlock::iterator I = InvokeDest->begin();
+             PHINode *PN = dyn_cast<PHINode>(I); ++I, ++i)
+          PN->addIncoming(InvokeDestPHIValues[i], BB);
       }
     }
 
@@ -264,3 +280,5 @@ bool InlineFunction(CallSite CS) {
   SimplifyCFG(AfterCallBB);
   return true;
 }
+
+} // End llvm namespace