[PATCH] D37112: [coroutines] Always place escaped allocas into the coroutine frame
Lewis Baker via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 1 04:38:08 PDT 2017
lewissbaker added inline comments.
================
Comment at: lib/Transforms/Coroutines/CoroFrame.cpp:889
for (User *U : I.users())
- if (Checker.isDefinitionAcrossSuspend(I, U)) {
+ if (Checker.isDefinitionAcrossSuspend(I, U) || allocaEscapes(&I)) {
// We cannot spill a token.
----------------
lewissbaker wrote:
> Does this mean that passing the address of any `alloca`d memory to a function call will cause it to be spilled even if its lifetime does not extend past a suspension point?
>
> I'm thinking of cases where we have:
> ```
> {
> co_await something;
> {
> int x = 123;
> escapes(&x);
> }
> co_await somethingElse;
> }
> ```
>
> Am I correct in understanding that with the proposed logic that `x` would be spilled to the frame even thought its lifetime does not cross a suspension-point? Can we avoid that?
>
> Should we be checking for `llvm.lifetime.start` / `llvm.lifetime.end` intrinsics and if found only considering the result of `allocaEscapes(&I)` if the lifetime start/end span contains a suspension point?
>
You're calling `allocaEscapes(&I)` for each `User` in `I.users()` here but the call doesn't seem to depend on the user.
Can the call to `allocaEscapes(&I)` be moved out of the loop and just called once?
https://reviews.llvm.org/D37112
More information about the llvm-commits
mailing list