Follow up to d0858bffa11, add missing REQUIRES x86
[llvm-project.git] / llvm / test / Transforms / Coroutines / coro-preserve-final.ll
blob16eeb84e7915ae2c9cbee87e1e7114e58b07cb3c
1 ; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S | FileCheck %s
3 %"struct.std::__n4861::noop_coroutine_promise" = type { i8 }
4 %struct.Promise = type { %"struct.std::__n4861::coroutine_handle" }
5 %"struct.std::__n4861::coroutine_handle" = type { ptr }
7 define dso_local ptr @_Z5Outerv() #1 {
8 entry:
9   %__promise = alloca %struct.Promise, align 8
10   %0 = call token @llvm.coro.id(i32 16, ptr nonnull %__promise, ptr nonnull @_Z5Outerv, ptr null)
11   %1 = call i1 @llvm.coro.alloc(token %0)
12   br i1 %1, label %coro.alloc, label %init.suspend
14 coro.alloc:                                       ; preds = %entry
15   %2 = tail call i64 @llvm.coro.size.i64()
16   %call = call noalias noundef nonnull ptr @_Znwm(i64 noundef %2) #12
17   br label %init.suspend
19 init.suspend:                                     ; preds = %entry, %coro.alloc
20   %3 = phi ptr [ null, %entry ], [ %call, %coro.alloc ]
21   %4 = call ptr @llvm.coro.begin(token %0, ptr %3) #13
22   call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %__promise) #3
23   store ptr null, ptr %__promise, align 8
24   %5 = call token @llvm.coro.save(ptr null)
25   %6 = call i8 @llvm.coro.suspend(token %5, i1 false)
26   switch i8 %6, label %coro.ret [
27   i8 0, label %await.suspend
28   i8 1, label %cleanup62
29   ]
31 await.suspend:                                    ; preds = %init.suspend
32   %7 = call token @llvm.coro.save(ptr null)
33   %8 = call ptr @llvm.coro.subfn.addr(ptr %4, i8 0)
34   call fastcc void %8(ptr %4) #3
35   %9 = call i8 @llvm.coro.suspend(token %7, i1 false)
36   switch i8 %9, label %coro.ret [
37   i8 0, label %await2.suspend
38   i8 1, label %cleanup62
39   ]
41 await2.suspend:                                   ; preds = %await.suspend
42   %call27 = call ptr @_Z5Innerv() #3
43   %10 = call token @llvm.coro.save(ptr null)
44   %11 = getelementptr inbounds i8, ptr %__promise, i64 -16
45   store ptr %11, ptr %call27, align 8
46   %12 = getelementptr inbounds i8, ptr %call27, i64 -16
47   %13 = call ptr @llvm.coro.subfn.addr(ptr nonnull %12, i8 0)
48   call fastcc void %13(ptr nonnull %12) #3
49   %14 = call i8 @llvm.coro.suspend(token %10, i1 false)
50   switch i8 %14, label %coro.ret [
51   i8 0, label %final.suspend
52   i8 1, label %cleanup62
53   ]
55 final.suspend:                                    ; preds = %await2.suspend
56   %15 = call ptr @llvm.coro.subfn.addr(ptr nonnull %12, i8 1)
57   call fastcc void %15(ptr nonnull %12) #3
58   %16 = call token @llvm.coro.save(ptr null)
59   %retval.sroa.0.0.copyload.i = load ptr, ptr %__promise, align 8
60   %17 = call ptr @llvm.coro.subfn.addr(ptr %retval.sroa.0.0.copyload.i, i8 0)
61   call fastcc void %17(ptr %retval.sroa.0.0.copyload.i) #3
62   %18 = call i8 @llvm.coro.suspend(token %16, i1 true) #13
63   switch i8 %18, label %coro.ret [
64   i8 0, label %final.ready
65   i8 1, label %cleanup62
66   ]
68 final.ready:                                      ; preds = %final.suspend
69   call void @_Z5_exiti(i32 noundef 1) #14
70   unreachable
72 cleanup62:                                        ; preds = %await2.suspend, %await.suspend, %init.suspend, %final.suspend
73   call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %__promise) #3
74   %19 = call ptr @llvm.coro.free(token %0, ptr %4)
75   %.not = icmp eq ptr %19, null
76   br i1 %.not, label %coro.ret, label %coro.free
78 coro.free:                                        ; preds = %cleanup62
79   call void @_ZdlPv(ptr noundef nonnull %19) #3
80   br label %coro.ret
82 coro.ret:                                         ; preds = %coro.free, %cleanup62, %final.suspend, %await2.suspend, %await.suspend, %init.suspend
83   %20 = call i1 @llvm.coro.end(ptr null, i1 false, token none) #13
84   ret ptr %__promise
87 declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr) #2
88 declare i1 @llvm.coro.alloc(token) #3
89 declare dso_local noundef nonnull ptr @_Znwm(i64 noundef) local_unnamed_addr #4
90 declare i64 @llvm.coro.size.i64() #5
91 declare ptr @llvm.coro.begin(token, ptr writeonly) #3
92 declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture) #6
93 declare token @llvm.coro.save(ptr) #7
94 declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture) #6
95 declare i8 @llvm.coro.suspend(token, i1) #3
96 declare dso_local ptr @_Z5Innerv() local_unnamed_addr #8
97 declare dso_local void @_ZdlPv(ptr noundef) local_unnamed_addr #9
98 declare ptr @llvm.coro.free(token, ptr nocapture readonly) #2
99 declare i1 @llvm.coro.end(ptr, i1, token) #3
100 declare dso_local void @_Z5_exiti(i32 noundef) local_unnamed_addr #10
101 declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #11
103 attributes #0 = { mustprogress nounwind uwtable "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
104 attributes #1 = { nounwind presplitcoroutine uwtable "frame-pointer"="none" "min-legal-vector-width"="0" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
105 attributes #2 = { argmemonly nofree nounwind readonly }
106 attributes #3 = { nounwind }
107 attributes #4 = { nobuiltin allocsize(0) "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
108 attributes #5 = { nofree nosync nounwind readnone }
109 attributes #6 = { argmemonly mustprogress nocallback nofree nosync nounwind willreturn }
110 attributes #7 = { nomerge nounwind }
111 attributes #8 = { "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
112 attributes #9 = { nobuiltin nounwind "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
113 attributes #10 = { noreturn "frame-pointer"="none" "no-trapping-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
114 attributes #11 = { argmemonly nounwind readonly }
115 attributes #12 = { nounwind allocsize(0) }
116 attributes #13 = { noduplicate }
117 attributes #14 = { noreturn nounwind }
119 ; CHECK: define{{.*}}@_Z5Outerv.resume(
120 ; CHECK: entry.resume:
121 ; CHECK: switch i2 %index
122 ; CHECK-NEXT:    i2 0, label %await2.suspend
123 ; CHECK-NEXT:    i2 1, label %final.suspend
125 ; CHECK: await2.suspend:
126 ; CHECK: musttail call
127 ; CHECK-NEXT: ret void
129 ; CHECK: final.suspend:
130 ; CHECK: musttail call
131 ; CHECK-NEXT: ret void