Skip to content

Commit b63befc

Browse files
committed
Update doc with llvm coro hello world
1 parent e3dc202 commit b63befc

File tree

1 file changed

+60
-1
lines changed

1 file changed

+60
-1
lines changed

docs/Coroutines.md

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,63 @@ def int_experimental_coro_from_promise : Intrinsic<[llvm_ptr_ty], [llvm_anyptr_t
4949
def int_experimental_coro_elide : Intrinsic<[llvm_ptr_ty], [], []>;
5050
def 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

Comments
 (0)