91 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2 3; RUN: opt < %s -passes='default<O2>' -S | FileCheck %s4 5target datalayout = "p:64:64:64"6 7declare {ptr, ptr, i32} @prototype_f(ptr, i1)8define {ptr, ptr, i32} @f(ptr %buffer, i32 %n, { i32 } %dummy) {9; CHECK-LABEL: @f(10; CHECK-NEXT: coro.return:11; CHECK-NEXT: [[N_VAL_SPILL_ADDR:%.*]] = getelementptr inbounds nuw i8, ptr [[BUFFER:%.*]], i64 812; CHECK-NEXT: store i32 [[N:%.*]], ptr [[N_VAL_SPILL_ADDR]], align 413; CHECK-NEXT: [[TMP0:%.*]] = tail call ptr @allocate(i32 [[N]])14; CHECK-NEXT: store ptr [[TMP0]], ptr [[BUFFER]], align 815; CHECK-NEXT: [[TMP1:%.*]] = insertvalue { ptr, ptr, i32 } { ptr @f.resume.0, ptr poison, i32 poison }, ptr [[TMP0]], 116; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { ptr, ptr, i32 } [[TMP1]], i32 [[N]], 217; CHECK-NEXT: ret { ptr, ptr, i32 } [[TMP2]]18;19entry:20 %id = call token @llvm.coro.id.retcon(i32 1024, i32 8, ptr %buffer, ptr @prototype_f, ptr @allocate, ptr @deallocate)21 %hdl = call ptr @llvm.coro.begin(token %id, ptr null)22 br label %loop23 24loop:25 %n.val = phi i32 [ %n, %entry ], [ %inc, %resume ]26 %alloca = call token @llvm.coro.alloca.alloc.i32(i32 %n.val, i32 8)27 %ptr = call ptr @llvm.coro.alloca.get(token %alloca)28 %unwind = call i1 (...) @llvm.coro.suspend.retcon.i1(ptr %ptr, i32 %n.val)29 call void @llvm.coro.alloca.free(token %alloca)30 br i1 %unwind, label %cleanup, label %resume31 32resume:33 %inc = add i32 %n.val, 134 br label %loop35 36cleanup:37 call void @llvm.coro.end(ptr %hdl, i1 0, token none)38 unreachable39}40 41 42declare {ptr, i32} @prototype_g(ptr, i1)43define {ptr, i32} @g(ptr %buffer, i32 %n) {44; CHECK-LABEL: @g(45; CHECK-NEXT: coro.return:46; CHECK-NEXT: store i32 [[N:%.*]], ptr [[BUFFER:%.*]], align 447; CHECK-NEXT: [[TMP0:%.*]] = zext i32 [[N]] to i6448; CHECK-NEXT: [[TMP1:%.*]] = alloca i8, i64 [[TMP0]], align 849; CHECK-NEXT: tail call void @use(ptr nonnull [[TMP1]])50; CHECK-NEXT: [[TMP2:%.*]] = insertvalue { ptr, i32 } { ptr @g.resume.0, i32 poison }, i32 [[N]], 151; CHECK-NEXT: ret { ptr, i32 } [[TMP2]]52;53entry:54 %id = call token @llvm.coro.id.retcon(i32 1024, i32 8, ptr %buffer, ptr @prototype_g, ptr @allocate, ptr @deallocate)55 %hdl = call ptr @llvm.coro.begin(token %id, ptr null)56 br label %loop57 58loop:59 %n.val = phi i32 [ %n, %entry ], [ %inc, %resume ]60 %alloca = call token @llvm.coro.alloca.alloc.i32(i32 %n.val, i32 8)61 %ptr = call ptr @llvm.coro.alloca.get(token %alloca)62 call void @use(ptr %ptr)63 call void @llvm.coro.alloca.free(token %alloca)64 %unwind = call i1 (...) @llvm.coro.suspend.retcon.i1(i32 %n.val)65 br i1 %unwind, label %cleanup, label %resume66 67resume:68 %inc = add i32 %n.val, 169 br label %loop70 71cleanup:72 call void @llvm.coro.end(ptr %hdl, i1 0, token none)73 unreachable74}75 76declare token @llvm.coro.id.retcon(i32, i32, ptr, ptr, ptr, ptr)77declare ptr @llvm.coro.begin(token, ptr)78declare i1 @llvm.coro.suspend.retcon.i1(...)79declare void @llvm.coro.suspend.retcon.isVoid(...)80declare void @llvm.coro.end(ptr, i1, token)81declare ptr @llvm.coro.prepare.retcon(ptr)82declare token @llvm.coro.alloca.alloc.i32(i32, i32)83declare ptr @llvm.coro.alloca.get(token)84declare void @llvm.coro.alloca.free(token)85 86declare noalias ptr @allocate(i32 %size)87declare void @deallocate(ptr %ptr)88 89declare void @print(i32)90declare void @use(ptr)91