summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2014-04-21 20:48:47 +0000
committerReid Kleckner <reid@kleckner.net>2014-04-21 20:48:47 +0000
commit0df9abbd63a6cb3767d3ddf3b6c2f8ea8a4f6f7e (patch)
tree4aa9b671f14fb7940eded1c5db0ad6c20e7fa92e /lib
parent290ce1944c02ec81787b80dc2a41119de5d7e412 (diff)
downloadllvm-0df9abbd63a6cb3767d3ddf3b6c2f8ea8a4f6f7e.tar.gz
llvm-0df9abbd63a6cb3767d3ddf3b6c2f8ea8a4f6f7e.tar.bz2
llvm-0df9abbd63a6cb3767d3ddf3b6c2f8ea8a4f6f7e.tar.xz
Fix PR7272 in -tailcallelim instead of the inliner
The -tailcallelim pass should be checking if byval or inalloca args can be captured before marking calls as tail calls. This was the real root cause of PR7272. With a better fix in place, revert the inliner change from r105255. The test case it introduced still passes and has been moved to test/Transforms/Inline/byval-tail-call.ll. Reviewers: chandlerc Differential Revision: http://reviews.llvm.org/D3403 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@206789 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Transforms/Scalar/TailRecursionElimination.cpp9
-rw-r--r--lib/Transforms/Utils/InlineFunction.cpp9
2 files changed, 10 insertions, 8 deletions
diff --git a/lib/Transforms/Scalar/TailRecursionElimination.cpp b/lib/Transforms/Scalar/TailRecursionElimination.cpp
index 6d02777d09..2f77f9c404 100644
--- a/lib/Transforms/Scalar/TailRecursionElimination.cpp
+++ b/lib/Transforms/Scalar/TailRecursionElimination.cpp
@@ -204,6 +204,15 @@ bool TailCallElim::runOnFunction(Function &F) {
}
}
+ // If any byval or inalloca args are captured, exit. They are also allocated
+ // in our stack frame.
+ for (Argument &Arg : F.args()) {
+ if (Arg.hasByValOrInAllocaAttr())
+ PointerMayBeCaptured(&Arg, &ACT);
+ if (ACT.Captured)
+ return false;
+ }
+
// Second pass, change any tail recursive calls to loops.
//
// FIXME: The code generator produces really bad code when an 'escaping
diff --git a/lib/Transforms/Utils/InlineFunction.cpp b/lib/Transforms/Utils/InlineFunction.cpp
index 5692d91c86..73d40f70b3 100644
--- a/lib/Transforms/Utils/InlineFunction.cpp
+++ b/lib/Transforms/Utils/InlineFunction.cpp
@@ -586,15 +586,8 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI,
if (CS.isByValArgument(ArgNo)) {
ActualArg = HandleByValArgument(ActualArg, TheCall, CalledFunc, IFI,
CalledFunc->getParamAlignment(ArgNo+1));
-
- // Calls that we inline may use the new alloca, so we need to clear
- // their 'tail' flags if HandleByValArgument introduced a new alloca and
- // the callee has calls.
- if (ActualArg != *AI) {
- MustClearTailCallFlags = true;
+ if (ActualArg != *AI)
ByValInit.push_back(std::make_pair(ActualArg, (Value*) *AI));
- }
-
}
VMap[I] = ActualArg;