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:
> > 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?
> If function receives pointer to alloca then it would not be marked with 
> "Tail". Then we do not have a possibility to understand whether this function 
> receives pointer to alloca but does not capture it:
> 
> ```
> void test(int recurseCount)
> {
>     if (recurseCount == 0) return;
>     int temp = 10;
>     globalIncrement(&temp);
>     test(recurseCount - 1);
> }
> ```
> 
> test - marked with Tail.
> globalIncrement - not marked with Tail. But TRE could be done since it does 
> not capture pointer. But if it will capture the pointer then we could not do 
> TRE. So we need to check !Tracker.EscapePoints.empty().
> 
> 
> 
> test - marked with Tail.

For the given code, TRE won't mark the recursive call "tail".  That transform 
isn't legal: the recursive call could access the caller's version of "temp".


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D82085/new/

https://reviews.llvm.org/D82085



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to