1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes='default<O2>' -S | FileCheck %s
4 ; Same test as coro-retcon.ll, but with opaque pointers enabled.
6 define ptr @f(ptr %buffer, i32 %n) {
8 ; CHECK-NEXT: coro.return:
9 ; CHECK-NEXT: store i32 [[N:%.*]], ptr [[BUFFER:%.*]], align 4
10 ; CHECK-NEXT: tail call void @print(i32 [[N]])
11 ; CHECK-NEXT: ret ptr @f.resume.0
14 %id = call token @llvm.coro.id.retcon(i32 8, i32 4, ptr %buffer, ptr @prototype, ptr @allocate, ptr @deallocate)
15 %hdl = call ptr @llvm.coro.begin(token %id, ptr null)
18 loop: ; preds = %resume, %entry
19 %n.val = phi i32 [ %n, %entry ], [ %inc, %resume ]
20 call void @print(i32 %n.val)
21 %unwind0 = call i1 (...) @llvm.coro.suspend.retcon.i1()
22 br i1 %unwind0, label %cleanup, label %resume
24 resume: ; preds = %loop
25 %inc = add i32 %n.val, 1
28 cleanup: ; preds = %loop
29 %0 = call i1 @llvm.coro.end(ptr %hdl, i1 false, token none)
36 ; CHECK-NEXT: tail call void @print(i32 4)
37 ; CHECK-NEXT: tail call void @llvm.experimental.noalias.scope.decl(metadata [[META0:![0-9]+]])
38 ; CHECK-NEXT: tail call void @print(i32 5), !noalias [[META0]]
39 ; CHECK-NEXT: tail call void @llvm.experimental.noalias.scope.decl(metadata [[META3:![0-9]+]])
40 ; CHECK-NEXT: tail call void @print(i32 6), !noalias [[META3]]
41 ; CHECK-NEXT: ret i32 0
44 %0 = alloca [8 x i8], align 4
45 %prepare = call ptr @llvm.coro.prepare.retcon(ptr @f)
46 %cont0 = call ptr %prepare(ptr %0, i32 4)
47 %cont1 = call ptr %cont0(ptr %0, i1 zeroext false)
48 %cont2 = call ptr %cont1(ptr %0, i1 zeroext false)
49 %1 = call ptr %cont2(ptr %0, i1 zeroext true)
53 define hidden { ptr, ptr } @g(ptr %buffer, ptr %ptr) {
55 ; CHECK-NEXT: coro.return:
56 ; CHECK-NEXT: [[TMP0:%.*]] = tail call ptr @allocate(i32 8)
57 ; CHECK-NEXT: store ptr [[TMP0]], ptr [[BUFFER:%.*]], align 8
58 ; CHECK-NEXT: store ptr [[PTR:%.*]], ptr [[TMP0]], align 8
59 ; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr, ptr } { ptr @g.resume.0, ptr poison }, ptr [[PTR]], 1
60 ; CHECK-NEXT: ret { ptr, ptr } [[TMP1]]
63 %id = call token @llvm.coro.id.retcon(i32 8, i32 4, ptr %buffer, ptr @g_prototype, ptr @allocate, ptr @deallocate)
64 %hdl = call ptr @llvm.coro.begin(token %id, ptr null)
67 loop: ; preds = %resume, %entry
68 %unwind0 = call i1 (...) @llvm.coro.suspend.retcon.i1(ptr %ptr)
69 br i1 %unwind0, label %cleanup, label %resume
71 resume: ; preds = %loop
74 cleanup: ; preds = %loop
75 %0 = call i1 @llvm.coro.end(ptr %hdl, i1 false, token none)
79 declare token @llvm.coro.id.retcon(i32, i32, ptr, ptr, ptr, ptr)
80 declare ptr @llvm.coro.begin(token, ptr)
81 declare i1 @llvm.coro.suspend.retcon.i1(...)
82 declare i1 @llvm.coro.end(ptr, i1, token)
83 declare ptr @llvm.coro.prepare.retcon(ptr)
85 declare ptr @prototype(ptr, i1 zeroext)
86 declare {ptr,ptr} @g_prototype(ptr, i1 zeroext)
88 declare noalias ptr @allocate(i32 %size)
89 declare void @deallocate(ptr %ptr)
91 declare void @print(i32)