mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-10-29 08:16:51 +00:00
Implement: Inline/cfg_preserve_test.ll
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8099 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -9,12 +9,13 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "llvm/Transforms/Utils/Cloning.h"
|
#include "llvm/Transforms/Utils/Cloning.h"
|
||||||
|
#include "llvm/DerivedTypes.h"
|
||||||
#include "llvm/Module.h"
|
#include "llvm/Module.h"
|
||||||
#include "llvm/iTerminators.h"
|
#include "llvm/iTerminators.h"
|
||||||
#include "llvm/iPHINode.h"
|
#include "llvm/iPHINode.h"
|
||||||
#include "llvm/iMemory.h"
|
#include "llvm/iMemory.h"
|
||||||
#include "llvm/iOther.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
|
// 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
|
// 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
|
// immediately before the call. The original basic block now ends with an
|
||||||
// unconditional branch to NewBB, and NewBB starts with the call instruction.
|
// 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");
|
NewBB->setName(OrigBB->getName()+".split");
|
||||||
|
|
||||||
// Remove (unlink) the CallInst from the start of the new basic block.
|
// 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(),
|
Caller->getBasicBlockList().splice(NewBB, Caller->getBasicBlockList(),
|
||||||
LastBlock, Caller->end());
|
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;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user