[llvm] [CoroSplit] Always erase lifetime intrinsics for spilled allocas (PR #142551)

Weibo He via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 3 00:47:38 PDT 2025


https://github.com/NewSigma updated https://github.com/llvm/llvm-project/pull/142551

>From 86dd52c644b8a04cd56e61af66a34ad439a7a01e Mon Sep 17 00:00:00 2001
From: NewSigma <NewSigma at 163.com>
Date: Tue, 3 Jun 2025 11:15:39 +0800
Subject: [PATCH 1/2] Erase lifetime intrinsics for spilled allocas

---
 llvm/lib/Transforms/Coroutines/CoroFrame.cpp | 25 +++++++++++---------
 1 file changed, 14 insertions(+), 11 deletions(-)

diff --git a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp
index 2f5f1089067bf..fdfddcc3425e9 100644
--- a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp
+++ b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp
@@ -1212,14 +1212,26 @@ static void insertSpills(const FrameDataInfo &FrameData, coro::Shape &Shape) {
   Builder.SetInsertPoint(Shape.AllocaSpillBlock,
                          Shape.AllocaSpillBlock->begin());
   SmallVector<Instruction *, 4> UsersToUpdate;
+  SmallVector<Instruction *, 4> Lifetimes;
   for (const auto &A : FrameData.Allocas) {
     AllocaInst *Alloca = A.Alloca;
     UsersToUpdate.clear();
+    Lifetimes.clear();
     for (User *U : Alloca->users()) {
       auto *I = cast<Instruction>(U);
-      if (DT.dominates(Shape.CoroBegin, I))
+      if (I->isLifetimeStartOrEnd())
+        Lifetimes.push_back(I);
+      else if (DT.dominates(Shape.CoroBegin, I))
         UsersToUpdate.push_back(I);
     }
+
+    // If it is hard to analyze, we will give up and put allocas to frame,
+    // even if they never cross suspend points.
+    // Lifetime intrinsics referring to alloca may fail guard storing to frame.
+    // Lifetime intrinsics referring to frames may block further optimizations.
+    for (auto *I : Lifetimes)
+      I->eraseFromParent();
+
     if (UsersToUpdate.empty())
       continue;
     auto *G = GetFramePointer(Alloca);
@@ -1233,17 +1245,8 @@ static void insertSpills(const FrameDataInfo &FrameData, coro::Shape &Shape) {
     for (auto *DVR : DbgVariableRecords)
       DVR->replaceVariableLocationOp(Alloca, G);
 
-    for (Instruction *I : UsersToUpdate) {
-      // It is meaningless to retain the lifetime intrinsics refer for the
-      // member of coroutine frames and the meaningless lifetime intrinsics
-      // are possible to block further optimizations.
-      if (I->isLifetimeStartOrEnd()) {
-        I->eraseFromParent();
-        continue;
-      }
-
+    for (Instruction *I : UsersToUpdate)
       I->replaceUsesOfWith(Alloca, G);
-    }
   }
   Builder.SetInsertPoint(&*Shape.getInsertPtAfterFramePtr());
   for (const auto &A : FrameData.Allocas) {

>From d3692f3207a9d096de89c0906758b91103f5b902 Mon Sep 17 00:00:00 2001
From: NewSigma <NewSigma at 163.com>
Date: Tue, 3 Jun 2025 15:46:30 +0800
Subject: [PATCH 2/2] Keep original comments

---
 llvm/lib/Transforms/Coroutines/CoroFrame.cpp | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp
index fdfddcc3425e9..c2afa559e4aaf 100644
--- a/llvm/lib/Transforms/Coroutines/CoroFrame.cpp
+++ b/llvm/lib/Transforms/Coroutines/CoroFrame.cpp
@@ -1226,9 +1226,12 @@ static void insertSpills(const FrameDataInfo &FrameData, coro::Shape &Shape) {
     }
 
     // If it is hard to analyze, we will give up and put allocas to frame,
-    // even if they never cross suspend points.
-    // Lifetime intrinsics referring to alloca may fail guard storing to frame.
-    // Lifetime intrinsics referring to frames may block further optimizations.
+    // even if they never cross suspend points.Lifetime intrinsics referring
+    // to alloca may fail guard storing to frame.
+    //
+    // It is meaningless to retain the lifetime intrinsics refer for the
+    // member of coroutine frames and the meaningless lifetime intrinsics
+    // are possible to block further optimizations.
     for (auto *I : Lifetimes)
       I->eraseFromParent();
 



More information about the llvm-commits mailing list