[llvm] 9871adc - [coro] [async] Make sure to reprocess non-split async functions (#153419)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 13 10:10:39 PDT 2025
Author: Arnold Schwaighofer
Date: 2025-08-13T10:10:35-07:00
New Revision: 9871adc54aa6df6edb1b5d18bb75f039e34689db
URL: https://github.com/llvm/llvm-project/commit/9871adc54aa6df6edb1b5d18bb75f039e34689db
DIFF: https://github.com/llvm/llvm-project/commit/9871adc54aa6df6edb1b5d18bb75f039e34689db.diff
LOG: [coro] [async] Make sure to reprocess non-split async functions (#153419)
We do this to inline the coro.end.async's tail called function into the
non-split async coroutine.
rdar://136296219
Added:
Modified:
llvm/lib/Transforms/Coroutines/CoroSplit.cpp
llvm/test/Transforms/Coroutines/coro-async.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp
index ab906f9fa03a1..180ac9c61e7df 100644
--- a/llvm/lib/Transforms/Coroutines/CoroSplit.cpp
+++ b/llvm/lib/Transforms/Coroutines/CoroSplit.cpp
@@ -2252,6 +2252,10 @@ PreservedAnalyses CoroSplitPass::run(LazyCallGraph::SCC &C,
UR.CWorklist.insert(CurrentSCC);
for (Function *Clone : Clones)
UR.CWorklist.insert(CG.lookupSCC(CG.get(*Clone)));
+ } else if (Shape.ABI == coro::ABI::Async) {
+ // Reprocess the function to inline the tail called return function of
+ // coro.async.end.
+ UR.CWorklist.insert(&C);
}
}
diff --git a/llvm/test/Transforms/Coroutines/coro-async.ll b/llvm/test/Transforms/Coroutines/coro-async.ll
index e5d2e6c2c42c6..331d6a60bed6b 100644
--- a/llvm/test/Transforms/Coroutines/coro-async.ll
+++ b/llvm/test/Transforms/Coroutines/coro-async.ll
@@ -496,6 +496,35 @@ entry:
; CHECK: call void @use(ptr null)
; CHECK: ret
+ at simpleFuncTu = global <{i32, i32}> <{
+ i32 trunc (i64 sub (i64 ptrtoint (ptr @simpleFunc to i64),
+ i64 ptrtoint (ptr @simpleFuncTu to i64)) to i32), i32 16 }>
+
+define swifttailcc void @simpleFunc(ptr swiftasync %0) presplitcoroutine {
+entry:
+ %1 = alloca ptr, align 8
+ %2 = call token @llvm.coro.id.async(i32 16, i32 16, i32 0, ptr @simpleFuncTu)
+ %3 = call ptr @llvm.coro.begin(token %2, ptr null)
+ store ptr %0, ptr %1, align 8
+ %4 = load ptr, ptr %1, align 8
+ %5 = getelementptr inbounds <{ ptr, ptr }>, ptr %4, i32 0, i32 1
+ %6 = load ptr, ptr %5, align 8
+ %7 = load ptr, ptr %1, align 8
+ %8 = call i1 (ptr, i1, ...) @llvm.coro.end.async(ptr %3, i1 false, ptr @simpleFunc.0, ptr %6, ptr %7)
+ unreachable
+}
+
+; CHECK-LABEL: define swifttailcc void @simpleFunc(ptr swiftasync %0) {
+; CHECK-NOT: define
+; CHECK: [[RESUME:%.*]] = load ptr
+; CHECK: musttail call swifttailcc void [[RESUME]]
+
+define internal swifttailcc void @simpleFunc.0(ptr %0, ptr %1) alwaysinline {
+entry:
+ musttail call swifttailcc void %0(ptr swiftasync %1)
+ ret void
+}
+
declare { ptr, ptr, ptr, ptr } @llvm.coro.suspend.async.sl_p0i8p0i8p0i8p0i8s(i32, ptr, ptr, ...)
declare ptr @llvm.coro.prepare.async(ptr)
declare token @llvm.coro.id.async(i32, i32, i32, ptr)
More information about the llvm-commits
mailing list