Implement: Inline/cfg_preserve_test.ll
authorChris Lattner <sabre@nondot.org>
Sun, 24 Aug 2003 04:06:56 +0000 (04:06 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 24 Aug 2003 04:06:56 +0000 (04:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8099 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/InlineFunction.cpp

index e88153e1f8bf674c72fed59b73302d61ac82735e..2fafef3f7ebf57a59da40f6fad4e4fe74d761d26 100644 (file)
@@ -9,12 +9,13 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Transforms/Utils/Cloning.h"
+#include "llvm/DerivedTypes.h"
 #include "llvm/Module.h"
 #include "llvm/iTerminators.h"
 #include "llvm/iPHINode.h"
 #include "llvm/iMemory.h"
 #include "llvm/iOther.h"
-#include "llvm/DerivedTypes.h"
+#include "llvm/Transforms/Utils/Local.h"
 
 // InlineFunction - This function inlines the called function into the basic
 // block of the caller.  This returns false if it is not possible to inline this
@@ -42,7 +43,8 @@ bool InlineFunction(CallInst *CI) {
   // immediately before the call.  The original basic block now ends with an
   // unconditional branch to NewBB, and NewBB starts with the call instruction.
   //
-  BasicBlock *NewBB = OrigBB->splitBasicBlock(CI);
+  BasicBlock *NewBB = OrigBB->splitBasicBlock(CI,
+                                              CalledFunc->getName()+".entry");
   NewBB->setName(OrigBB->getName()+".split");
 
   // Remove (unlink) the CallInst from the start of the new basic block.  
@@ -160,5 +162,16 @@ bool InlineFunction(CallInst *CI) {
   Caller->getBasicBlockList().splice(NewBB, Caller->getBasicBlockList(), 
                                      LastBlock, Caller->end());
 
+  // We should always be able to fold the entry block of the function into the
+  // single predecessor of the block...
+  assert(cast<BranchInst>(Br)->isUnconditional() && "splitBasicBlock broken!");
+  BasicBlock *CalleeEntry = cast<BranchInst>(Br)->getSuccessor(0);
+  SimplifyCFG(CalleeEntry);
+  
+  // Okay, continue the CFG cleanup.  It's often the case that there is only a
+  // single return instruction in the callee function.  If this is the case,
+  // then we have an unconditional branch from the return block to the 'NewBB'.
+  // Check for this case, and eliminate the branch is possible.
+  SimplifyCFG(NewBB);
   return true;
 }