1; Fifth example from Doc/Coroutines.rst (final suspend) 2; RUN: opt < %s -aa-pipeline=basic-aa -passes='default<O2>' -preserve-alignment-assumptions-during-inlining=false -S | FileCheck %s 3 4define ptr @f(i32 %n) presplitcoroutine { 5entry: 6 %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null) 7 %size = call i32 @llvm.coro.size.i32() 8 %alloc = call ptr @malloc(i32 %size) 9 %hdl = call noalias ptr @llvm.coro.begin(token %id, ptr %alloc) 10 br label %while.cond 11while.cond: 12 %n.val = phi i32 [ %n, %entry ], [ %dec, %while.body ] 13 %cmp = icmp sgt i32 %n.val, 0 14 br i1 %cmp, label %while.body, label %while.end 15 16while.body: 17 %dec = add nsw i32 %n.val, -1 18 call void @print(i32 %n.val) #4 19 %s = call i8 @llvm.coro.suspend(token none, i1 false) 20 switch i8 %s, label %suspend [i8 0, label %while.cond 21 i8 1, label %cleanup] 22while.end: 23 %s.final = call i8 @llvm.coro.suspend(token none, i1 true) 24 switch i8 %s.final, label %suspend [i8 0, label %trap 25 i8 1, label %cleanup] 26trap: 27 call void @llvm.trap() 28 unreachable 29cleanup: 30 %mem = call ptr @llvm.coro.free(token %id, ptr %hdl) 31 call void @free(ptr %mem) 32 br label %suspend 33suspend: 34 call i1 @llvm.coro.end(ptr %hdl, i1 false, token none) 35 ret ptr %hdl 36} 37 38declare noalias ptr @malloc(i32) 39declare void @print(i32) 40declare void @llvm.trap() 41declare void @free(ptr nocapture) 42 43declare token @llvm.coro.id( i32, ptr, ptr, ptr) 44declare i32 @llvm.coro.size.i32() 45declare ptr @llvm.coro.begin(token, ptr) 46declare token @llvm.coro.save(ptr) 47declare i8 @llvm.coro.suspend(token, i1) 48declare ptr @llvm.coro.free(token, ptr) 49declare i1 @llvm.coro.end(ptr, i1, token) 50 51; CHECK-LABEL: @main 52define i32 @main() { 53entry: 54 %hdl = call ptr @f(i32 4) 55 br label %while 56while: 57 call void @llvm.coro.resume(ptr %hdl) 58 %done = call i1 @llvm.coro.done(ptr %hdl) 59 br i1 %done, label %end, label %while 60end: 61 call void @llvm.coro.destroy(ptr %hdl) 62 ret i32 0 63 64; CHECK: call void @print(i32 4) 65; CHECK: call void @print(i32 3) 66; CHECK: call void @print(i32 2) 67; CHECK: call void @print(i32 1) 68; CHECK: ret i32 0 69} 70 71declare i1 @llvm.coro.done(ptr) 72declare void @llvm.coro.resume(ptr) 73declare void @llvm.coro.destroy(ptr) 74