[Instrumentation] Fix a warning
[llvm-project.git] / llvm / test / Transforms / Coroutines / coro-elide.ll
blob86ed88167bfe45b85a8a2f7c9d4580381e6b4b50
1 ; Tests that the coro.destroy and coro.resume are devirtualized where possible,
2 ; SCC pipeline restarts and inlines the direct calls.
3 ; RUN: opt < %s -S \
4 ; RUN: -passes='cgscc(inline,function(coro-elide,dce),inline,function(coro-elide,dce))' \
5 ; RUN:   | FileCheck %s
7 declare void @print(i32) nounwind
9 ; resume part of the coroutine
10 define fastcc void @f.resume(ptr dereferenceable(1)) {
11   tail call void @print(i32 0)
12   ret void
15 ; destroy part of the coroutine
16 define fastcc void @f.destroy(ptr) {
17   tail call void @print(i32 1)
18   ret void
21 ; cleanup part of the coroutine
22 define fastcc void @f.cleanup(ptr) {
23   tail call void @print(i32 2)
24   ret void
27 @f.resumers = internal constant [3 x ptr] [ptr @f.resume,
28                                                    ptr @f.destroy,
29                                                    ptr @f.cleanup]
31 ; a coroutine start function
32 define ptr @f() {
33 entry:
34   %id = call token @llvm.coro.id(i32 0, ptr null,
35                           ptr @f,
36                           ptr @f.resumers)
37   %alloc = call i1 @llvm.coro.alloc(token %id)
38   %hdl = call ptr @llvm.coro.begin(token %id, ptr null)
39   ret ptr %hdl
42 ; CHECK-LABEL: @callResume(
43 define void @callResume() {
44 entry:
45   %hdl = call ptr @f()
47 ; CHECK: call void @print(i32 0)
48   %0 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)
49   call fastcc void %0(ptr %hdl)
51 ; CHECK-NEXT: call void @print(i32 2)
52   %1 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 1)
53   call fastcc void %1(ptr %hdl)
55 ; CHECK-NEXT: ret void
56   ret void
59 ; CHECK-LABEL: @callResumeMultiRet(
60 define void @callResumeMultiRet(i1 %b) {
61 entry:
62   %hdl = call ptr @f()
63 ; CHECK: %alloc.i = call i1 @llvm.coro.alloc
64 ; CHECK: call void @print(i32 0)
65   %0 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)
66   call fastcc void %0(ptr %hdl)
67   br i1 %b, label %destroy, label %ret
69 destroy:
70 ; CHECK: call void @print(i32 1)
71   %1 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 1)
72   call fastcc void %1(ptr %hdl)
73   ret void
75 ret:
76   ret void
79 ; CHECK-LABEL: @callResumeMultiRetDommmed(
80 define void @callResumeMultiRetDommmed(i1 %b) {
81 entry:
82   %hdl = call ptr @f()
83 ; CHECK-NOT: %alloc.i = call i1 @llvm.coro.alloc
84 ; CHECK: call void @print(i32 0)
85   %0 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)
86   call fastcc void %0(ptr %hdl)
87 ; CHECK: call void @print(i32 2)
88   %1 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 1)
89   call fastcc void %1(ptr %hdl)
90   br i1 %b, label %destroy, label %ret
92 destroy:
93   ret void
95 ret:
96   ret void
99 ; CHECK-LABEL: @eh(
100 define void @eh() personality ptr null {
101 entry:
102   %hdl = call ptr @f()
104 ; CHECK: call void @print(i32 0)
105   %0 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)
106   invoke void %0(ptr %hdl)
107           to label %cont unwind label %ehcleanup
108 cont:
109   ret void
111 ehcleanup:
112   %tok = cleanuppad within none []
113   cleanupret from %tok unwind to caller
116 ; CHECK-LABEL: @no_devirt_info_null(
117 ; no devirtualization here, since coro.begin info parameter is null
118 define void @no_devirt_info_null() {
119 entry:
120   %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)
121   %hdl = call ptr @llvm.coro.begin(token %id, ptr null)
123 ; CHECK: call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)
124   %0 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)
125   call fastcc void %0(ptr %hdl)
127 ; CHECK: call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 1)
128   %1 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 1)
129   call fastcc void %1(ptr %hdl)
131 ; CHECK: ret void
132   ret void
135 ; CHECK-LABEL: @no_devirt_no_begin(
136 ; no devirtualization here, since coro.begin is not visible
137 define void @no_devirt_no_begin(ptr %hdl) {
138 entry:
140 ; CHECK: call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)
141   %0 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)
142   call fastcc void %0(ptr %hdl)
144 ; CHECK: call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 1)
145   %1 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 1)
146   call fastcc void %1(ptr %hdl)
148 ; CHECK: ret void
149   ret void
152 declare token @llvm.coro.id(i32, ptr, ptr, ptr)
153 declare ptr @llvm.coro.begin(token, ptr)
154 declare ptr @llvm.coro.frame()
155 declare ptr @llvm.coro.subfn.addr(ptr, i8)
156 declare i1 @llvm.coro.alloc(token)