[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