[RISCV] Rename a lambda to have plural nouns to reflect that it contains a loop. NFC
[llvm-project.git] / llvm / test / Transforms / Coroutines / coro-retcon-frame.ll
bloba81cdf475ae31adb171f859148da51ae0b842775
1 ; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S | FileCheck %s
3 target datalayout = "p:64:64:64"
5 declare void @prototype_f(ptr, i1)
7 declare noalias ptr @allocate(i32 %size)
8 declare void @deallocate(ptr %ptr)
9 declare void @init(ptr %ptr)
10 declare void @use(ptr %ptr)
11 declare void @use_addr_val(i64 %val, ptr %addr)
13 define { ptr, ptr } @f(ptr %buffer) presplitcoroutine {
14 entry:
15   %tmp = alloca { i64, i64 }, align 8
16   %proj.1 = getelementptr inbounds { i64, i64 }, ptr %tmp, i64 0, i32 0
17   %proj.2 = getelementptr inbounds { i64, i64 }, ptr %tmp, i64 0, i32 1
18   store i64 0, ptr %proj.1, align 8
19   store i64 0, ptr %proj.2, align 8
20   %escape_addr = ptrtoint ptr %tmp to i64
21   %id = call token @llvm.coro.id.retcon.once(i32 32, i32 8, ptr %buffer, ptr @prototype_f, ptr @allocate, ptr @deallocate)
22   %hdl = call ptr @llvm.coro.begin(token %id, ptr null)
23   %proj.2.2 = getelementptr inbounds { i64, i64 }, ptr %tmp, i64 0, i32 1
24   call void @init(ptr %proj.1)
25   call void @init(ptr %proj.2.2)
26   call void @use_addr_val(i64 %escape_addr, ptr %tmp)
27   %abort = call i1 (...) @llvm.coro.suspend.retcon.i1(ptr %tmp)
28   br i1 %abort, label %end, label %resume
30 resume:
31   call void @use(ptr %tmp)
32   br label %end
34 end:
35   call i1 @llvm.coro.end(ptr %hdl, i1 0, token none)
36   unreachable
38 ; Make sure we don't lose writes to the frame.
39 ; CHECK-LABEL: define { ptr, ptr } @f(ptr %buffer) {
40 ; CHECK:  [[PROJ2:%.*]] = getelementptr inbounds { i64, i64 }, ptr %buffer, i64 0, i32 1
41 ; CHECK:  store i64 0, ptr %buffer
42 ; CHECK:  store i64 0, ptr [[PROJ2]]
43 ; CHECK:  [[ESCAPED_ADDR:%.*]] = ptrtoint ptr %buffer to i64
44 ; CHECK:  call void @init(ptr %buffer)
45 ; CHECK:  call void @init(ptr [[PROJ2]])
46 ; CHECK:  call void @use_addr_val(i64 [[ESCAPED_ADDR]], ptr %buffer)
48 ; CHECK-LABEL: define internal void @f.resume.0(ptr {{.*}} %0, i1 %1) {
49 ; CHECK: resume:
50 ; CHECK:  call void @use(ptr %0)
52 declare token @llvm.coro.id.retcon.once(i32, i32, ptr, ptr, ptr, ptr)
53 declare ptr @llvm.coro.begin(token, ptr)
54 declare i1 @llvm.coro.suspend.retcon.i1(...)
55 declare i1 @llvm.coro.end(ptr, i1, token)