[PATCH] D82085: [TRE] allow TRE for non-capturing calls.
Eli Friedman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 22 15:03:30 PDT 2020
efriedma added inline comments.
================
Comment at: llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp:825
+ // The local stack holds all alloca instructions and all byval arguments.
+ AllocaDerivedValueTracker Tracker;
+ for (Argument &Arg : F.args()) {
----------------
avl wrote:
> efriedma wrote:
> > Do you have to redo the AllocaDerivedValueTracker analysis? Is it not enough that the call you're trying to TRE is marked "tail"?
> >Do you have to redo the AllocaDerivedValueTracker analysis?
>
> AllocaDerivedValueTracker analysis(done in markTails) could be reused here.
> But marking, done in markTails(), looks like separate tasks. i.e. it is better
> to make TRE not depending on markTails(). There is a review for this - https://reviews.llvm.org/D60031
> Thus such separation looks useful(To not reuse result of markTails but have it computed inplace).
>
> > Is it not enough that the call you're trying to TRE is marked "tail"?
>
> It is not enough that call which is subject to TRE is marked "Tail".
> It also should be checked that other calls does not capture pointer to local stack:
>
> ```
> // do not do TRE if any pointer to local stack has escaped.
> if (!Tracker.EscapePoints.empty())
> return false;
>
> ```
>
> It is not enough that call which is subject to TRE is marked "Tail". It also should be checked that other calls does not capture pointer to local stack:
If there's an escaped pointer to the local stack, we wouldn't infer "tail" in the first place, would we?
================
Comment at: llvm/lib/Transforms/Scalar/TailRecursionElimination.cpp:852
+
+ // Do not do TRE if exists recursive calls which are not last calls.
+ if (!isTailBlock(CI->getParent()) ||
----------------
avl wrote:
> efriedma wrote:
> > I thought we had some tests where we TRE in the presence of recursive calls, like a simple recursive fibonacci. Am I misunderstanding this?
> right, there is a testcase for fibonacchi:
>
> llvm/test/Transforms/TailCallElim/accum_recursion.ll:@test3_fib
>
> areAllLastFuncCallsRecursive() checking works well for fibonacci testcase:
>
>
> ```
> return fib(x-1)+fib(x-2);
>
> ```
>
> Since, Last funcs call chain is : fib()->fib()->ret.
> That check should prevent from such cases:
>
>
> ```
> return fib(x-1)+another_call()+fib(x-2);
> ```
>
>
> That check should prevent from such cases: return fib(x-1)+another_call()+fib(x-2);
Why do we need to prevent this?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D82085/new/
https://reviews.llvm.org/D82085
More information about the cfe-commits
mailing list