diff options
author | Chris Lattner <sabre@nondot.org> | 2005-05-06 06:47:52 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-05-06 06:47:52 +0000 |
commit | 9f3dced2c79044c6c31470066c3e418ee94798bc (patch) | |
tree | 9676ece0f6401b0b0fb0ee63602a60d453ad6d2c /llvm/lib/Transforms/Utils/InlineFunction.cpp | |
parent | 318e328fc464f349e329a64af4f9b22362895e22 (diff) | |
download | bcm5719-llvm-9f3dced2c79044c6c31470066c3e418ee94798bc.tar.gz bcm5719-llvm-9f3dced2c79044c6c31470066c3e418ee94798bc.zip |
Implement Transforms/Inline/inline-tail.ll
llvm-svn: 21736
Diffstat (limited to 'llvm/lib/Transforms/Utils/InlineFunction.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/InlineFunction.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index 97ee58f71a0..4513f54aa8b 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -46,6 +46,12 @@ bool llvm::InlineFunction(CallSite CS) { CalledFunc->isExternal() || // call, or call to a vararg function! CalledFunc->getFunctionType()->isVarArg()) return false; + + // If the call to the callee is a non-tail call, we must clear the 'tail' + // flags on any calls that we inline. + bool MustClearTailCallFlags = + isa<CallInst>(TheCall) || !cast<CallInst>(TheCall)->isTailCall(); + BasicBlock *OrigBB = TheCall->getParent(); Function *Caller = OrigBB->getParent(); @@ -101,6 +107,15 @@ bool llvm::InlineFunction(CallSite CS) { } } + // If we are inlining tail call instruction through an invoke or + if (MustClearTailCallFlags) { + for (Function::iterator BB = FirstNewBlock, E = Caller->end(); + BB != E; ++BB) + for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; ++I) + if (CallInst *CI = dyn_cast<CallInst>(I)) + CI->setTailCall(false); + } + // If we are inlining for an invoke instruction, we must make sure to rewrite // any inlined 'unwind' instructions into branches to the invoke exception // destination, and call instructions into invoke instructions. @@ -124,7 +139,7 @@ bool llvm::InlineFunction(CallSite CS) { // require no special handling... if (CallInst *CI = dyn_cast<CallInst>(I)) { // Convert this function call into an invoke instruction... if it's - // not an intrinsic function call (which are known to not throw). + // not an intrinsic function call (which are known to not unwind). if (CI->getCalledFunction() && CI->getCalledFunction()->getIntrinsicID()) { ++I; |