138 lines · plain
1; RUN: opt < %s -passes='cgscc(coro-split),early-cse,dce,simplifycfg' -S | FileCheck %s2 3%"struct.std::__n4861::noop_coroutine_promise" = type { i8 }4%struct.Promise = type { %"struct.std::__n4861::coroutine_handle" }5%"struct.std::__n4861::coroutine_handle" = type { ptr }6 7define ptr @foo() #1 {8entry:9 %__promise = alloca %struct.Promise, align 810 %0 = call token @llvm.coro.id(i32 16, ptr nonnull %__promise, ptr nonnull @foo, ptr null)11 %1 = call i1 @llvm.coro.alloc(token %0)12 br i1 %1, label %coro.alloc, label %init.suspend13 14coro.alloc: ; preds = %entry15 %2 = tail call i64 @llvm.coro.size.i64()16 %call = call noalias noundef nonnull ptr @_Znwm(i64 noundef %2) #1117 br label %init.suspend18 19init.suspend: ; preds = %entry, %coro.alloc20 %3 = phi ptr [ null, %entry ], [ %call, %coro.alloc ]21 %4 = call ptr @llvm.coro.begin(token %0, ptr %3) #1222 call void @llvm.lifetime.start.p0(ptr nonnull %__promise) #323 store ptr null, ptr %__promise, align 824 %5 = call token @llvm.coro.save(ptr null)25 %6 = call i8 @llvm.coro.suspend(token %5, i1 false)26 switch i8 %6, label %coro.ret [27 i8 0, label %await.suspend28 i8 1, label %cleanup129 ]30 31await.suspend: ; preds = %init.suspend32 %7 = call token @llvm.coro.save(ptr null)33 %8 = call i8 @llvm.coro.suspend(token %7, i1 false)34 switch i8 %8, label %coro.ret [35 i8 0, label %await2.suspend36 i8 1, label %cleanup237 ]38 39await2.suspend: ; preds = %await.suspend40 %call27 = call ptr @_Z5Innerv() #341 %9 = call token @llvm.coro.save(ptr null)42 %10 = getelementptr inbounds i8, ptr %__promise, i64 -1643 store ptr %10, ptr %call27, align 844 %11 = getelementptr inbounds i8, ptr %call27, i64 -1645 %12 = call ptr @llvm.coro.subfn.addr(ptr nonnull %11, i8 0)46 call fastcc void %12(ptr nonnull %11) #347 %13 = call i8 @llvm.coro.suspend(token %9, i1 false)48 switch i8 %13, label %coro.ret [49 i8 0, label %final.suspend50 i8 1, label %cleanup351 ]52 53final.suspend: ; preds = %await2.suspend54 %14 = call ptr @llvm.coro.subfn.addr(ptr nonnull %11, i8 1)55 call fastcc void %14(ptr nonnull %11) #356 %15 = call token @llvm.coro.save(ptr null)57 %retval.sroa.0.0.copyload.i = load ptr, ptr %__promise, align 858 %16 = call ptr @llvm.coro.subfn.addr(ptr %retval.sroa.0.0.copyload.i, i8 0)59 call fastcc void %16(ptr %retval.sroa.0.0.copyload.i) #360 %17 = call i8 @llvm.coro.suspend(token %15, i1 true) #1261 switch i8 %17, label %coro.ret [62 i8 0, label %final.ready63 i8 1, label %cleanup6264 ]65 66final.ready: ; preds = %final.suspend67 call void @exit(i32 noundef 1)68 unreachable69 70cleanup1:71 call void @dtor1()72 br label %cleanup6273 74cleanup2:75 call void @dtor2()76 br label %cleanup6277 78cleanup3:79 call void @dtor3()80 br label %cleanup6281 82cleanup62: ; preds = %await2.suspend, %await.suspend, %init.suspend, %final.suspend83 call void @llvm.lifetime.end.p0(ptr nonnull %__promise) #384 %18 = call ptr @llvm.coro.free(token %0, ptr %4)85 %.not = icmp eq ptr %18, null86 br i1 %.not, label %coro.ret, label %coro.free87 88coro.free: ; preds = %cleanup6289 call void @_ZdlPv(ptr noundef nonnull %18) #390 br label %coro.ret91 92coro.ret: ; preds = %coro.free, %cleanup62, %final.suspend, %await2.suspend, %await.suspend, %init.suspend93 call void @llvm.coro.end(ptr null, i1 false, token none) #1294 ret ptr %__promise95}96 97declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr) #298declare i1 @llvm.coro.alloc(token) #399declare dso_local noundef nonnull ptr @_Znwm(i64 noundef) local_unnamed_addr #4100declare i64 @llvm.coro.size.i64() #5101declare ptr @llvm.coro.begin(token, ptr writeonly) #3102declare void @llvm.lifetime.start.p0(ptr nocapture) #6103declare token @llvm.coro.save(ptr) #7104declare void @llvm.lifetime.end.p0(ptr nocapture) #6105declare i8 @llvm.coro.suspend(token, i1) #3106declare ptr @_Z5Innerv() local_unnamed_addr107declare dso_local void @_ZdlPv(ptr noundef) local_unnamed_addr #8108declare ptr @llvm.coro.free(token, ptr nocapture readonly) #2109declare void @llvm.coro.end(ptr, i1, token) #3110declare void @exit(i32 noundef)111declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #10112declare void @dtor1()113declare void @dtor2()114declare void @dtor3()115 116attributes #0 = { mustprogress nounwind uwtable }117attributes #1 = { nounwind presplitcoroutine uwtable coro_only_destroy_when_complete }118attributes #2 = { argmemonly nofree nounwind readonly }119attributes #3 = { nounwind }120attributes #4 = { nobuiltin allocsize(0) }121attributes #5 = { nofree nosync nounwind readnone }122attributes #6 = { argmemonly mustprogress nocallback nofree nosync nounwind willreturn }123attributes #7 = { nomerge nounwind }124attributes #8 = { nobuiltin nounwind }125attributes #9 = { noreturn }126attributes #10 = { argmemonly nounwind readonly }127attributes #11 = { nounwind allocsize(0) }128attributes #12 = { noduplicate }129 130; CHECK: define{{.*}}@foo.destroy(131; CHECK-NEXT: entry.destroy:132; CHECK-NEXT: call void @_ZdlPv133; CHECK-NEXT: ret void134 135; CHECK: define{{.*}}@foo.cleanup(136; CHECK-NEXT: entry.cleanup:137; CHECK-NEXT: ret void138