diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp b/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp index 6d02777d091..2f77f9c404f 100644 --- a/llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp +++ b/llvm/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 |