Skip to content

Commit 3026ca3

Browse files
committed
[Coro] Adopt ret.popless intrinsic.
Delete provisional coro.return intrinsic.
1 parent 39998ff commit 3026ca3

File tree

4 files changed

+109
-11
lines changed

4 files changed

+109
-11
lines changed

llvm/include/llvm/IR/Intrinsics.td

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1768,10 +1768,6 @@ def int_coro_await_suspend_handle : Intrinsic<[],
17681768
[llvm_ptr_ty, llvm_ptr_ty, llvm_ptr_ty],
17691769
[Throws]>;
17701770

1771-
// FIXME: enforce musttail
1772-
// XXX: attrs; not throws, wb DefaultAttrsIntrinsic
1773-
def int_coro_return : Intrinsic<[llvm_any_ty], [LLVMMatchType<0>], []>;
1774-
17751771
// Coroutine Lowering Intrinsics. Used internally by coroutine passes.
17761772

17771773
def int_coro_subfn_addr : DefaultAttrsIntrinsic<

llvm/lib/Transforms/Coroutines/CoroCleanup.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,6 @@ bool Lowerer::lower(Function &F) {
7272
case Intrinsic::coro_id_async:
7373
II->replaceAllUsesWith(ConstantTokenNone::get(Context));
7474
break;
75-
case Intrinsic::coro_return:
76-
// FIXME: Remove this case with backend support.
77-
II->replaceAllUsesWith(II->getArgOperand(0));
78-
break;
7975
case Intrinsic::coro_subfn_addr:
8076
lowerSubFn(Builder, cast<CoroSubFnInst>(II));
8177
break;

llvm/lib/Transforms/Coroutines/CoroSplit.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1987,9 +1987,12 @@ static void splitRetconCoroutine(Function &F, coro::Shape &Shape,
19871987
F.getContext(), "coro.return.normal", &F, NewSuspendBB);
19881988
Builder.CreateCondBr(NullAllocator, PoplessReturnBB, NormalReturnBB);
19891989
IRBuilder<> PoplessBuilder(PoplessReturnBB);
1990-
auto *WrapRetV = PoplessBuilder.CreateIntrinsic(
1991-
RetV->getType(), Intrinsic::coro_return, {RetV});
1992-
PoplessBuilder.CreateRet(WrapRetV);
1990+
auto &Context = F.getContext();
1991+
auto *VoidTy = Type::getVoidTy(Context);
1992+
auto *RetPopless =
1993+
PoplessBuilder.CreateIntrinsic(VoidTy, Intrinsic::ret_popless, {});
1994+
RetPopless->setTailCallKind(CallInst::TailCallKind::TCK_MustTail);
1995+
PoplessBuilder.CreateRet(RetV);
19931996
IRBuilder<> NormalBuilder(NormalReturnBB);
19941997
NormalBuilder.CreateRet(RetV);
19951998
} else {
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
; RUN: opt < %s -passes='module(coro-early),cgscc(coro-split),module(coro-cleanup)' -S | FileCheck %s
2+
3+
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
4+
target triple = "arm64-apple-macos99.99"
5+
6+
; CHECK-LABEL: %func.Frame = type { ptr }
7+
8+
; CHECK-LABEL: @func_cfp = constant <{ i32, i32 }>
9+
; CHECK-SAME: <{
10+
; CHECK-SAME: i32 trunc
11+
; CHECK-SAME: i32 16
12+
; CHECK-SAME: }>
13+
@func_cfp = constant <{ i32, i32 }>
14+
<{ i32 trunc ( ; offset to @func from @func_cfp
15+
i64 sub (
16+
i64 ptrtoint (ptr @func to i64),
17+
i64 ptrtoint (ptr getelementptr inbounds (<{ i32, i32 }>, ptr @func_cfp, i32 0, i32 1) to i64)
18+
)
19+
to i32),
20+
i32 64 ; frame size
21+
}>
22+
23+
24+
; CHECK-LABEL: @func(
25+
; CHECK-SAME: ptr %buffer,
26+
; CHECK-SAME: ptr %allocator
27+
; CHECK-SAME: ptr %array
28+
; CHECK-SAME: ) {
29+
; CHECK: %array.spill.addr = getelementptr inbounds %func.Frame, ptr %buffer, i32 0, i32 0
30+
; CHECK: store ptr %array, ptr %array.spill.addr
31+
; CHECK: %load = load i32, ptr %array
32+
; CHECK: %load.positive = icmp sgt i32 %load, 0
33+
; CHECK: [[CONTINUATION:%.*]] = select i1 %load.positive
34+
; CHECK-SAME: ptr @func.resume.0
35+
; CHECK-SAME: ptr @func.resume.1
36+
; CHECK: [[RETVAL_1:%.*]] = insertvalue { ptr, i32 } poison, ptr [[CONTINUATION:%.*]], 0
37+
; CHECK: [[RETVAL_2:%.*]] = insertvalue { ptr, i32 } [[RETVAL_1:%.*]], i32 %load, 1
38+
; CHECK: [[DONT_POP:%.*]] = icmp eq ptr %allocator, null
39+
; CHECK: br i1 [[DONT_POP:%[^,]+]],
40+
; CHECK-SAME: label %coro.return.popless
41+
; CHECK-SAME: label %coro.return.normal
42+
; CHECK: coro.return.popless:
43+
; CHECK: musttail call void @llvm.ret.popless()
44+
; CHECK: ret { ptr, i32 } [[RETVAL_2:%.*]]
45+
; CHECK: coro.return.normal:
46+
; CHECK: ret { ptr, i32 } [[RETVAL_2:%.*]]
47+
; CHECK: }
48+
49+
; CHECK-LABEL: @func.resume.0(
50+
; CHECK-SAME: ptr [[BUFFER:[^,]+]]
51+
; CHECK-SAME: ptr [[ALLOCATOR:%[^)]+]]
52+
; CHECK-SAME: ) {
53+
; CHECK: %array.reload.addr3 = getelementptr inbounds %func.Frame, ptr [[BUFFER:%.*]], i32 0, i32 0
54+
; CHECK: %array.reload4 = load ptr, ptr %array.reload.addr3
55+
; CHECK: store i32 0, ptr %array.reload4
56+
; CHECK: ret void
57+
; CHECK: }
58+
59+
; CHECK-LABEL: @func.resume.1(
60+
; CHECK-SAME: ptr [[BUFFER:[^,]+]]
61+
; CHECK-SAME: ptr [[ALLOCATOR:%[^)]+]]
62+
; CHECK-SAME: ) {
63+
; CHECK: %array.reload.addr = getelementptr inbounds %func.Frame, ptr [[BUFFER:%.*]], i32 0, i32 0
64+
; CHECK: %array.reload = load ptr, ptr %array.reload.addr
65+
; CHECK: store i32 10, ptr %array.reload
66+
; CHECK: ret void
67+
; CHECK: }
68+
define swiftcorocc {ptr, i32} @func(ptr %buffer, ptr %allocator, ptr %array) {
69+
entry:
70+
%id = call token @llvm.coro.id.retcon.once.dynamic(
71+
i32 -1,
72+
i32 16,
73+
ptr @func_cfp,
74+
ptr %allocator,
75+
ptr %buffer,
76+
ptr @continuation_prototype,
77+
ptr @allocate,
78+
ptr @deallocate
79+
)
80+
%handle = call ptr @llvm.coro.begin(token %id, ptr null)
81+
%load = load i32, ptr %array
82+
%load.positive = icmp sgt i32 %load, 0
83+
br i1 %load.positive, label %positive, label %negative
84+
85+
positive:
86+
call ptr (...) @llvm.coro.suspend.retcon.p0(i32 %load)
87+
store i32 0, ptr %array, align 4
88+
br label %cleanup
89+
90+
negative:
91+
call ptr (...) @llvm.coro.suspend.retcon.p0(i32 %load)
92+
store i32 10, ptr %array, align 4
93+
br label %cleanup
94+
95+
cleanup:
96+
call i1 @llvm.coro.end(ptr %handle, i1 0, token none)
97+
unreachable
98+
}
99+
100+
declare void @continuation_prototype(ptr, ptr)
101+
102+
declare swiftcorocc noalias ptr @allocate(i32 %size)
103+
declare void @deallocate(ptr %ptr)

0 commit comments

Comments
 (0)