@@ -49,4 +49,63 @@ def int_experimental_coro_from_promise : Intrinsic<[llvm_ptr_ty], [llvm_anyptr_t
4949def int_experimental_coro_elide : Intrinsic<[ llvm_ptr_ty] , [ ] , [ ] >;
5050def int_experimental_coro_delete : Intrinsic<[ llvm_i1_ty] , [ llvm_ptr_ty] , [ ] >;
5151
52- ## Optimizations
52+ ## Optimizations
53+
54+ ## Coroutine Hello World
55+
56+ declare noalias i8* @malloc(i32)
57+ declare void @free(i8*)
58+ declare void @yield(i32)
59+
60+ declare void @llvm.experimental.coro.resume(i8*)
61+ declare void @llvm.experimental.coro.destroy(i8*)
62+ declare i8* @llvm.experimental.coro.init(i8*, i8*, i8*)
63+ declare i32 @llvm.experimental.coro.size()
64+ declare i1 @llvm.experimental.coro.fork()
65+ declare token @llvm.experimental.coro.save(i32)
66+ ;declare i8* @llvm.experimental.coro.frame()
67+ declare i1 @llvm.experimental.coro.suspend(token)
68+ declare i8* @llvm.experimental.coro.delete(i8*)
69+ declare void @llvm.experimental.coro.resume.end()
70+
71+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
72+
73+ define i8* @f(i32 %n) {
74+ entry:
75+ %frame.size = call i32 @llvm.experimental.coro.size()
76+ %alloc = call noalias i8* @malloc(i32 %frame.size)
77+ %frame = call i8* @llvm.experimental.coro.init(i8* %alloc, i8* null, i8* null)
78+ %first.return = call i1 @llvm.experimental.coro.fork()
79+ br i1 %first.return, label %coro.return, label %coro.start
80+
81+ coro.start:
82+ %n.val = phi i32 [ %n, %entry ], [ %inc, %resume ]
83+ call void @yield(i32 %n.val)
84+ %save = call token @llvm.experimental.coro.save(i32 1)
85+ %suspend = call i1 @llvm.experimental.coro.suspend(token %save)
86+ br i1 %suspend, label %resume, label %cleanup
87+
88+ resume:
89+ %inc = add i32 %n.val, 1
90+ br label %coro.start
91+
92+ cleanup:
93+ %mem = call i8* @llvm.experimental.coro.delete(i8* %frame)
94+ call void @free(i8* %mem)
95+ call void @llvm.experimental.coro.resume.end()
96+ br label %coro.return
97+
98+ coro.return:
99+ ret i8* %frame
100+ }
101+
102+ ;;;;;;;;;;;;;;;;;;;;;;;;;;;
103+
104+ define i32 @main() {
105+ entry:
106+ %hdl = call i8* @f(i32 4)
107+ call void @llvm.experimental.coro.resume(i8* %hdl)
108+ call void @llvm.experimental.coro.resume(i8* %hdl)
109+ call void @llvm.experimental.coro.destroy(i8* %hdl)
110+ ret i32 0
111+ }
0 commit comments