64 lines · plain
1; Tests that coro-split will convert coro.await.suspend.handle to a musttail call.2; RUN: opt < %s -passes='cgscc(coro-split),simplifycfg,early-cse' -S | FileCheck %s3; RUN: opt < %s -passes='pgo-instr-gen,cgscc(coro-split),simplifycfg,early-cse' -S | FileCheck %s4 5declare void @fakeresume1(ptr align 8)6 7define void @g() #0 {8entry:9 %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)10 %alloc = call ptr @malloc(i64 16) #311 %alloc.var = alloca i812 call void @llvm.lifetime.start.p0(ptr %alloc.var)13 %vFrame = call noalias nonnull ptr @llvm.coro.begin(token %id, ptr %alloc)14 15 %save = call token @llvm.coro.save(ptr null)16 %suspend = call i8 @llvm.coro.suspend(token %save, i1 false)17 18 switch i8 %suspend, label %exit [19 i8 0, label %await.suspend20 i8 1, label %exit21 ]22await.suspend:23 %save2 = call token @llvm.coro.save(ptr null)24 call void @llvm.coro.await.suspend.handle(ptr null, ptr null, ptr @await_suspend_function)25 %suspend2 = call i8 @llvm.coro.suspend(token %save2, i1 false)26 switch i8 %suspend2, label %exit [27 i8 0, label %await.ready28 i8 1, label %exit29 ]30await.ready:31 call void @consume(ptr %alloc.var)32 call void @llvm.lifetime.end.p0(ptr %alloc.var)33 br label %exit34exit:35 call void @llvm.coro.end(ptr null, i1 false, token none)36 ret void37}38 39; Verify that in the resume part resume call is marked with musttail.40; CHECK-LABEL: @g.resume(41; CHECK: musttail call fastcc void42; CHECK-NEXT: ret void43 44declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr) #145declare i1 @llvm.coro.alloc(token) #246declare i64 @llvm.coro.size.i64() #347declare ptr @llvm.coro.begin(token, ptr writeonly) #248declare token @llvm.coro.save(ptr) #249declare ptr @llvm.coro.frame() #350declare i8 @llvm.coro.suspend(token, i1) #251declare ptr @llvm.coro.free(token, ptr nocapture readonly) #152declare void @llvm.coro.end(ptr, i1, token) #253declare ptr @llvm.coro.subfn.addr(ptr nocapture readonly, i8) #154declare ptr @malloc(i64)55declare void @consume(ptr)56declare void @llvm.lifetime.start.p0(ptr nocapture)57declare void @llvm.lifetime.end.p0(ptr nocapture)58declare ptr @await_suspend_function(ptr %awaiter, ptr %hdl)59 60attributes #0 = { presplitcoroutine }61attributes #1 = { argmemonly nounwind readonly }62attributes #2 = { nounwind }63attributes #3 = { nounwind readnone }64