157 lines · plain
1; Tests that the coro.destroy and coro.resume are devirtualized where possible,2; SCC pipeline restarts and inlines the direct calls.3; RUN: opt < %s -S \4; RUN: -passes='cgscc(inline,function(coro-elide,dce),inline,function(coro-elide,dce))' \5; RUN: | FileCheck %s6 7declare void @print(i32) nounwind8 9; resume part of the coroutine10define fastcc void @f.resume(ptr dereferenceable(1)) {11 tail call void @print(i32 0)12 ret void13}14 15; destroy part of the coroutine16define fastcc void @f.destroy(ptr) {17 tail call void @print(i32 1)18 ret void19}20 21; cleanup part of the coroutine22define fastcc void @f.cleanup(ptr) {23 tail call void @print(i32 2)24 ret void25}26 27@f.resumers = internal constant [3 x ptr] [ptr @f.resume,28 ptr @f.destroy,29 ptr @f.cleanup]30 31; a coroutine start function32define ptr @f() {33entry:34 %id = call token @llvm.coro.id(i32 0, ptr null,35 ptr @f,36 ptr @f.resumers)37 %alloc = call i1 @llvm.coro.alloc(token %id)38 %hdl = call ptr @llvm.coro.begin(token %id, ptr null)39 ret ptr %hdl40}41 42; CHECK-LABEL: @callResume(43define void @callResume() {44entry:45 %hdl = call ptr @f()46 47; CHECK: call void @print(i32 0)48 %0 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)49 call fastcc void %0(ptr %hdl)50 51; CHECK-NEXT: call void @print(i32 2)52 %1 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 1)53 call fastcc void %1(ptr %hdl)54 55; CHECK-NEXT: ret void56 ret void57}58 59; CHECK-LABEL: @callResumeMultiRet(60define void @callResumeMultiRet(i1 %b) {61entry:62 %hdl = call ptr @f()63; CHECK: %alloc.i = call i1 @llvm.coro.alloc64; CHECK: call void @print(i32 0)65 %0 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)66 call fastcc void %0(ptr %hdl)67 br i1 %b, label %destroy, label %ret68 69destroy:70; CHECK: call void @print(i32 1)71 %1 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 1)72 call fastcc void %1(ptr %hdl)73 ret void74 75ret:76 ret void77}78 79; CHECK-LABEL: @callResumeMultiRetDommmed(80define void @callResumeMultiRetDommmed(i1 %b) {81entry:82 %hdl = call ptr @f()83; CHECK-NOT: %alloc.i = call i1 @llvm.coro.alloc84; CHECK: call void @print(i32 0)85 %0 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)86 call fastcc void %0(ptr %hdl)87; CHECK: call void @print(i32 2)88 %1 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 1)89 call fastcc void %1(ptr %hdl)90 br i1 %b, label %destroy, label %ret91 92destroy:93 ret void94 95ret:96 ret void97}98 99; CHECK-LABEL: @eh(100define void @eh() personality ptr null {101entry:102 %hdl = call ptr @f()103 104; CHECK: call void @print(i32 0)105 %0 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)106 invoke void %0(ptr %hdl)107 to label %cont unwind label %ehcleanup108cont:109 ret void110 111ehcleanup:112 %tok = cleanuppad within none []113 cleanupret from %tok unwind to caller114}115 116; CHECK-LABEL: @no_devirt_info_null(117; no devirtualization here, since coro.begin info parameter is null118define void @no_devirt_info_null() {119entry:120 %id = call token @llvm.coro.id(i32 0, ptr null, ptr null, ptr null)121 %hdl = call ptr @llvm.coro.begin(token %id, ptr null)122 123; CHECK: call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)124 %0 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)125 call fastcc void %0(ptr %hdl)126 127; CHECK: call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 1)128 %1 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 1)129 call fastcc void %1(ptr %hdl)130 131; CHECK: ret void132 ret void133}134 135; CHECK-LABEL: @no_devirt_no_begin(136; no devirtualization here, since coro.begin is not visible137define void @no_devirt_no_begin(ptr %hdl) {138entry:139 140; CHECK: call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)141 %0 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 0)142 call fastcc void %0(ptr %hdl)143 144; CHECK: call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 1)145 %1 = call ptr @llvm.coro.subfn.addr(ptr %hdl, i8 1)146 call fastcc void %1(ptr %hdl)147 148; CHECK: ret void149 ret void150}151 152declare token @llvm.coro.id(i32, ptr, ptr, ptr)153declare ptr @llvm.coro.begin(token, ptr)154declare ptr @llvm.coro.frame()155declare ptr @llvm.coro.subfn.addr(ptr, i8)156declare i1 @llvm.coro.alloc(token)157