92 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes='default<O2>' -S | FileCheck %s3 4; Same test as coro-retcon.ll, but with opaque pointers enabled.5 6define ptr @f(ptr %buffer, i32 %n) {7; CHECK-LABEL: @f(8; CHECK-NEXT: coro.return:9; CHECK-NEXT: store i32 [[N:%.*]], ptr [[BUFFER:%.*]], align 410; CHECK-NEXT: tail call void @print(i32 [[N]])11; CHECK-NEXT: ret ptr @f.resume.012;13entry: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)16 br label %loop17 18loop: ; preds = %resume, %entry19 %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 %resume23 24resume: ; preds = %loop25 %inc = add i32 %n.val, 126 br label %loop27 28cleanup: ; preds = %loop29 call void @llvm.coro.end(ptr %hdl, i1 false, token none)30 unreachable31}32 33define i32 @main() {34; CHECK-LABEL: @main(35; CHECK-NEXT: entry: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 042;43entry:44 %0 = alloca [8 x i8], align 445 %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)50 ret i32 051}52 53define hidden { ptr, ptr } @g(ptr %buffer, ptr %ptr) {54; CHECK-LABEL: @g(55; CHECK-NEXT: coro.return:56; CHECK-NEXT: [[TMP0:%.*]] = tail call ptr @allocate(i32 8)57; CHECK-NEXT: store ptr [[TMP0]], ptr [[BUFFER:%.*]], align 858; CHECK-NEXT: store ptr [[PTR:%.*]], ptr [[TMP0]], align 859; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr, ptr } { ptr @g.resume.0, ptr poison }, ptr [[PTR]], 160; CHECK-NEXT: ret { ptr, ptr } [[TMP1]]61;62entry: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)65 br label %loop66 67loop: ; preds = %resume, %entry68 %unwind0 = call i1 (...) @llvm.coro.suspend.retcon.i1(ptr %ptr)69 br i1 %unwind0, label %cleanup, label %resume70 71resume: ; preds = %loop72 br label %loop73 74cleanup: ; preds = %loop75 call void @llvm.coro.end(ptr %hdl, i1 false, token none)76 unreachable77}78 79declare token @llvm.coro.id.retcon(i32, i32, ptr, ptr, ptr, ptr)80declare ptr @llvm.coro.begin(token, ptr)81declare i1 @llvm.coro.suspend.retcon.i1(...)82declare void @llvm.coro.end(ptr, i1, token)83declare ptr @llvm.coro.prepare.retcon(ptr)84 85declare ptr @prototype(ptr, i1 zeroext)86declare {ptr,ptr} @g_prototype(ptr, i1 zeroext)87 88declare noalias ptr @allocate(i32 %size)89declare void @deallocate(ptr %ptr)90 91declare void @print(i32)92