brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · 5484fec Raw
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