[llvm] [coro][CoroSplit] Use `llvm.lifetime.end` to compute putting objects on the frame vs the stack (PR #90265)

Chuanqi Xu via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 29 23:24:00 PDT 2024


================
@@ -1614,6 +1621,24 @@ struct AllocaUseVisitor : PtrUseVisitor<AllocaUseVisitor> {
       // suspend point between lifetime markers. This should also cover the
       // case of a single lifetime.start intrinsic in a loop with suspend point.
       if (PI.isEscaped()) {
+        // If there is no explicit lifetime.end, then assume the address can
+        // cross suspension points.
+        if (LifetimeEndBBs.empty())
+          return true;
+
+        // If there is a path from a lifetime.start to a suspend without a
+        // corresponding lifetime.end, then the alloca's lifetime persists
+        // beyond that suspension point and the alloca must go on the frame.
+        for (AnyCoroSuspendInst *SuspendInst : CoroShape.CoroSuspends) {
+          SmallVector<BasicBlock *> LifetimeStartsBB;
+          for (IntrinsicInst *II : LifetimeStarts)
+            LifetimeStartsBB.push_back(II->getParent());
+          if (isPotentiallyReachableFromMany(LifetimeStartsBB,
----------------
ChuanqiXu9 wrote:

Got it.  I think it will be better to extend `isPotentiallyReachableFromMany` to `isManyPotentiallyReachableFromMany`. e.g., we don't need to iterate the suspending block. The implementation of `isPotentiallyReachableFromMany` looks not complex and should be doable. We can add it in CoroFrame locally or contribute that to CFG.h. 

For cache, yeah, it looks like we can't have an easy one : (

https://github.com/llvm/llvm-project/pull/90265


More information about the llvm-commits mailing list