brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 9a2697e Raw
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