74 lines · plain
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 %s3 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.cond11while.cond:12 %n.val = phi i32 [ %n, %entry ], [ %dec, %while.body ]13 %cmp = icmp sgt i32 %n.val, 014 br i1 %cmp, label %while.body, label %while.end15 16while.body:17 %dec = add nsw i32 %n.val, -118 call void @print(i32 %n.val) #419 %s = call i8 @llvm.coro.suspend(token none, i1 false)20 switch i8 %s, label %suspend [i8 0, label %while.cond21 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 %trap25 i8 1, label %cleanup]26trap: 27 call void @llvm.trap()28 unreachable29cleanup:30 %mem = call ptr @llvm.coro.free(token %id, ptr %hdl)31 call void @free(ptr %mem)32 br label %suspend33suspend:34 call void @llvm.coro.end(ptr %hdl, i1 false, token none)35 ret ptr %hdl36}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 void @llvm.coro.end(ptr, i1, token)50 51; CHECK-LABEL: @main52define i32 @main() {53entry:54 %hdl = call ptr @f(i32 4)55 br label %while56while:57 call void @llvm.coro.resume(ptr %hdl)58 %done = call i1 @llvm.coro.done(ptr %hdl)59 br i1 %done, label %end, label %while60end:61 call void @llvm.coro.destroy(ptr %hdl)62 ret i32 063 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 069}70 71declare i1 @llvm.coro.done(ptr)72declare void @llvm.coro.resume(ptr)73declare void @llvm.coro.destroy(ptr)74