brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.2 KiB · 3640b83 Raw
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