summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/InlineFunction.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2005-05-06 06:47:52 +0000
committerChris Lattner <sabre@nondot.org>2005-05-06 06:47:52 +0000
commit9f3dced2c79044c6c31470066c3e418ee94798bc (patch)
tree9676ece0f6401b0b0fb0ee63602a60d453ad6d2c /llvm/lib/Transforms/Utils/InlineFunction.cpp
parent318e328fc464f349e329a64af4f9b22362895e22 (diff)
downloadbcm5719-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.cpp17
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;
OpenPOWER on IntegriCloud