From 7152c237b46a920b29d5605af934766b8f9a07a1 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 24 Aug 2003 04:06:56 +0000 Subject: [PATCH] Implement: Inline/cfg_preserve_test.ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8099 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/InlineFunction.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/Transforms/Utils/InlineFunction.cpp b/lib/Transforms/Utils/InlineFunction.cpp index e88153e1f8b..2fafef3f7eb 100644 --- a/lib/Transforms/Utils/InlineFunction.cpp +++ b/lib/Transforms/Utils/InlineFunction.cpp @@ -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(Br)->isUnconditional() && "splitBasicBlock broken!"); + BasicBlock *CalleeEntry = cast(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; } -- 2.34.1