143 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 42; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S | FileCheck %s3 4declare ptr @malloc(i64)5 6%i8.array = type { [100 x i8] }7declare void @consume.i8.array(ptr)8 9@testbool = external local_unnamed_addr global i8, align 110 11; testval does not contain an explicit lifetime end. We must assume that it may12; live across suspension.13define void @HasNoLifetimeEnd() presplitcoroutine {14; CHECK-LABEL: define void @HasNoLifetimeEnd() {15; CHECK-NEXT: entry:16; CHECK-NEXT: [[ID:%.*]] = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr @HasNoLifetimeEnd.resumers)17; CHECK-NEXT: [[ALLOC:%.*]] = call ptr @malloc(i64 16)18; CHECK-NEXT: [[VFRAME:%.*]] = call noalias nonnull ptr @llvm.coro.begin(token [[ID]], ptr [[ALLOC]])19; CHECK-NEXT: store ptr @HasNoLifetimeEnd.resume, ptr [[VFRAME]], align 820; CHECK-NEXT: [[DESTROY_ADDR:%.*]] = getelementptr inbounds nuw [[HASNOLIFETIMEEND_FRAME:%.*]], ptr [[VFRAME]], i32 0, i32 121; CHECK-NEXT: store ptr @HasNoLifetimeEnd.destroy, ptr [[DESTROY_ADDR]], align 822; CHECK-NEXT: [[INDEX_ADDR1:%.*]] = getelementptr inbounds [[HASNOLIFETIMEEND_FRAME]], ptr [[VFRAME]], i32 0, i32 223; CHECK-NEXT: call void @consume.i8.array(ptr [[INDEX_ADDR1]])24; CHECK-NEXT: [[INDEX_ADDR2:%.*]] = getelementptr inbounds nuw [[HASNOLIFETIMEEND_FRAME]], ptr [[VFRAME]], i32 0, i32 325; CHECK-NEXT: store i1 false, ptr [[INDEX_ADDR2]], align 126; CHECK-NEXT: ret void27;28entry:29 %testval = alloca %i8.array30 %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)31 %alloc = call ptr @malloc(i64 16) #332 %vFrame = call noalias nonnull ptr @llvm.coro.begin(token %id, ptr %alloc)33 34 call void @llvm.lifetime.start.p0(ptr %testval)35 call void @consume.i8.array(ptr %testval)36 37 %save = call token @llvm.coro.save(ptr null)38 %suspend = call i8 @llvm.coro.suspend(token %save, i1 false)39 switch i8 %suspend, label %exit [40 i8 0, label %await.ready41 i8 1, label %exit42 ]43await.ready:44 br label %exit45exit:46 call void @llvm.coro.end(ptr null, i1 false, token none)47 ret void48}49 50define void @LifetimeEndAfterCoroEnd() presplitcoroutine {51; CHECK-LABEL: define void @LifetimeEndAfterCoroEnd() {52; CHECK-NEXT: entry:53; CHECK-NEXT: [[ID:%.*]] = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr @LifetimeEndAfterCoroEnd.resumers)54; CHECK-NEXT: [[ALLOC:%.*]] = call ptr @malloc(i64 16)55; CHECK-NEXT: [[VFRAME:%.*]] = call noalias nonnull ptr @llvm.coro.begin(token [[ID]], ptr [[ALLOC]])56; CHECK-NEXT: store ptr @LifetimeEndAfterCoroEnd.resume, ptr [[VFRAME]], align 857; CHECK-NEXT: [[DESTROY_ADDR:%.*]] = getelementptr inbounds nuw [[LIFETIMEENDAFTERCOROEND_FRAME:%.*]], ptr [[VFRAME]], i32 0, i32 158; CHECK-NEXT: store ptr @LifetimeEndAfterCoroEnd.destroy, ptr [[DESTROY_ADDR]], align 859; CHECK-NEXT: [[INDEX_ADDR1:%.*]] = getelementptr inbounds [[LIFETIMEENDAFTERCOROEND_FRAME]], ptr [[VFRAME]], i32 0, i32 260; CHECK-NEXT: call void @consume.i8.array(ptr [[INDEX_ADDR1]])61; CHECK-NEXT: [[INDEX_ADDR2:%.*]] = getelementptr inbounds nuw [[LIFETIMEENDAFTERCOROEND_FRAME]], ptr [[VFRAME]], i32 0, i32 362; CHECK-NEXT: store i1 false, ptr [[INDEX_ADDR2]], align 163; CHECK-NEXT: ret void64;65entry:66 %testval = alloca %i8.array67 %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)68 %alloc = call ptr @malloc(i64 16) #369 %vFrame = call noalias nonnull ptr @llvm.coro.begin(token %id, ptr %alloc)70 71 call void @llvm.lifetime.start.p0(ptr %testval)72 call void @consume.i8.array(ptr %testval)73 74 %save = call token @llvm.coro.save(ptr null)75 %suspend = call i8 @llvm.coro.suspend(token %save, i1 false)76 switch i8 %suspend, label %exit [77 i8 0, label %await.ready78 i8 1, label %exit79 ]80await.ready:81 br label %exit82exit:83 call void @llvm.coro.end(ptr null, i1 false, token none)84 call void @llvm.lifetime.end.p0(ptr %testval)85 ret void86}87 88define void @BranchWithoutLifetimeEnd() presplitcoroutine {89; CHECK-LABEL: define void @BranchWithoutLifetimeEnd() {90; CHECK-NEXT: entry:91; CHECK-NEXT: [[ID:%.*]] = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr @BranchWithoutLifetimeEnd.resumers)92; CHECK-NEXT: [[ALLOC:%.*]] = call ptr @malloc(i64 16)93; CHECK-NEXT: [[VFRAME:%.*]] = call noalias nonnull ptr @llvm.coro.begin(token [[ID]], ptr [[ALLOC]])94; CHECK-NEXT: store ptr @BranchWithoutLifetimeEnd.resume, ptr [[VFRAME]], align 895; CHECK-NEXT: [[DESTROY_ADDR:%.*]] = getelementptr inbounds nuw [[BRANCHWITHOUTLIFETIMEEND_FRAME:%.*]], ptr [[VFRAME]], i32 0, i32 196; CHECK-NEXT: store ptr @BranchWithoutLifetimeEnd.destroy, ptr [[DESTROY_ADDR]], align 897; CHECK-NEXT: [[TESTVAL:%.*]] = getelementptr inbounds [[BRANCHWITHOUTLIFETIMEEND_FRAME]], ptr [[VFRAME]], i32 0, i32 298; CHECK-NEXT: call void @consume.i8.array(ptr [[TESTVAL]])99; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr @testbool, align 1100; CHECK-NEXT: [[INDEX_ADDR1:%.*]] = getelementptr inbounds nuw [[BRANCHWITHOUTLIFETIMEEND_FRAME]], ptr [[VFRAME]], i32 0, i32 3101; CHECK-NEXT: store i1 false, ptr [[INDEX_ADDR1]], align 1102; CHECK-NEXT: ret void103;104entry:105 %testval = alloca %i8.array106 %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)107 %alloc = call ptr @malloc(i64 16) #3108 %vFrame = call noalias nonnull ptr @llvm.coro.begin(token %id, ptr %alloc)109 110 call void @llvm.lifetime.start.p0(ptr %testval)111 call void @consume.i8.array(ptr %testval)112 113 %0 = load i8, ptr @testbool, align 1114 %tobool = trunc nuw i8 %0 to i1115 br i1 %tobool, label %if.then, label %if.end116 117if.then:118 call void @llvm.lifetime.end.p0(ptr %testval)119 br label %if.end120 121if.end:122 %save = call token @llvm.coro.save(ptr null)123 %suspend = call i8 @llvm.coro.suspend(token %save, i1 false)124 switch i8 %suspend, label %exit [125 i8 0, label %await.ready126 i8 1, label %exit127 ]128await.ready:129 br label %exit130exit:131 call void @llvm.coro.end(ptr null, i1 false, token none)132 ret void133}134 135 136declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr)137declare ptr @llvm.coro.begin(token, ptr writeonly) #3138declare ptr @llvm.coro.frame() #5139declare i8 @llvm.coro.suspend(token, i1) #3140declare void @llvm.coro.end(ptr, i1, token) #3141declare void @llvm.lifetime.start.p0(ptr nocapture) #4142declare void @llvm.lifetime.end.p0(ptr nocapture) #4143