159 lines · plain
1; RUN: opt -passes="cgscc(coro-annotation-elide)" -S < %s | FileCheck %s2 3%foo.Frame = type { ptr, ptr, i1 }4 5@foo.resumers = private constant [3 x ptr] [ptr @foo.resume, ptr @foo.destroy, ptr @foo.cleanup]6@foo.resumers.1 = private constant [4 x ptr] [ptr @foo.resume, ptr @foo.destroy, ptr @foo.cleanup, ptr @foo.noalloc]7 8; CHECK-LABEL: define void @foo9define void @foo(ptr %agg.result, ptr %this) personality ptr null {10entry:11 %0 = call token @llvm.coro.id(i32 0, ptr null, ptr nonnull @foo, ptr @foo.resumers.1)12 %1 = call noalias nonnull ptr @llvm.coro.begin(token %0, ptr null)13 %resume.addr = getelementptr inbounds nuw %foo.Frame, ptr %1, i32 0, i32 014 store ptr @foo.resume, ptr %resume.addr, align 815 %destroy.addr = getelementptr inbounds nuw %foo.Frame, ptr %1, i32 0, i32 116 store ptr @foo.destroy, ptr %destroy.addr, align 817 br label %AllocaSpillBB18 19AllocaSpillBB: ; preds = %entry20 br label %PostSpill21 22PostSpill: ; preds = %AllocaSpillBB23 br label %CoroSave24 25CoroSave: ; preds = %PostSpill26 %index.addr1 = getelementptr inbounds nuw %foo.Frame, ptr %1, i32 0, i32 227 store i1 false, ptr %index.addr1, align 128 br label %CoroSuspend29 30CoroSuspend: ; preds = %CoroSave31 br label %resume.0.landing32 33resume.0.landing: ; preds = %CoroSuspend34 br label %AfterCoroSuspend35 36AfterCoroSuspend: ; preds = %resume.0.landing37 ret void38}39 40; CHECK-LABEL: define internal void @bar41; Function Attrs: presplitcoroutine42define internal void @bar() #0 personality ptr null {43entry:44 ; CHECK: %[[CALLEE_FRAME:.+]] = alloca [24 x i8], align 845 %0 = call token @llvm.coro.id(i32 0, ptr null, ptr nonnull @bar, ptr null)46 %1 = call i1 @llvm.coro.alloc(token %0)47 call void @foo(ptr null, ptr null) #448 ; CHECK: %[[FOO_ID:.+]] = call token @llvm.coro.id(i32 0, ptr null, ptr nonnull @foo, ptr @foo.resumers)49 ; CHECK-NEXT: store ptr @foo.resume, ptr %[[CALLEE_FRAME]], align 850 ; CHECK-NEXT: %[[DESTROY_ADDR:.+]] = getelementptr inbounds nuw %foo.Frame, ptr %[[CALLEE_FRAME]], i32 0, i32 151 ; CHECK-NEXT: store ptr @foo.destroy, ptr %[[DESTROY_ADDR]], align 852 ; CHECK-NEXT: %[[INDEX_ADDR:.+]] = getelementptr inbounds nuw %foo.Frame, ptr %[[CALLEE_FRAME]], i32 0, i32 253 ; CHECK-NEXT: store i1 false, ptr %[[INDEX_ADDR]], align 154 ; CHECK: ret void55 ret void56}57 58; Function Attrs: mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: read)59declare token @llvm.coro.id(i32, ptr readnone, ptr nocapture readonly, ptr) #160 61; Function Attrs: nounwind62declare i1 @llvm.coro.alloc(token) #263 64; Function Attrs: nounwind65declare ptr @llvm.coro.begin(token, ptr writeonly) #266 67; Function Attrs: nomerge nounwind68declare token @llvm.coro.save(ptr) #369 70; Function Attrs: nounwind71declare i8 @llvm.coro.suspend(token, i1) #272 73define internal fastcc void @foo.resume(ptr noundef nonnull align 8 dereferenceable(24) %0) personality ptr null {74entry.resume:75 br label %resume.entry76 77resume.0: ; preds = %resume.entry78 br label %resume.0.landing79 80resume.0.landing: ; preds = %resume.081 br label %AfterCoroSuspend82 83AfterCoroSuspend: ; preds = %resume.0.landing84 unreachable85 86resume.entry: ; preds = %entry.resume87 br label %resume.088}89 90define internal fastcc void @foo.destroy(ptr noundef nonnull align 8 dereferenceable(24) %0) personality ptr null {91entry.destroy:92 br label %resume.entry93 94resume.0: ; preds = %resume.entry95 br label %resume.0.landing96 97resume.0.landing: ; preds = %resume.098 br label %AfterCoroSuspend99 100AfterCoroSuspend: ; preds = %resume.0.landing101 unreachable102 103resume.entry: ; preds = %entry.destroy104 br label %resume.0105}106 107define internal fastcc void @foo.cleanup(ptr noundef nonnull align 8 dereferenceable(24) %0) personality ptr null {108entry.cleanup:109 br label %resume.entry110 111resume.0: ; preds = %resume.entry112 br label %resume.0.landing113 114resume.0.landing: ; preds = %resume.0115 br label %AfterCoroSuspend116 117AfterCoroSuspend: ; preds = %resume.0.landing118 unreachable119 120resume.entry: ; preds = %entry.cleanup121 br label %resume.0122}123 124define internal void @foo.noalloc(ptr %0, ptr %1, ptr noundef nonnull align 8 dereferenceable(24) %2) personality ptr null {125entry:126 %3 = call token @llvm.coro.id(i32 0, ptr null, ptr nonnull @foo, ptr @foo.resumers)127 %resume.addr = getelementptr inbounds nuw %foo.Frame, ptr %2, i32 0, i32 0128 store ptr @foo.resume, ptr %resume.addr, align 8129 %destroy.addr = getelementptr inbounds nuw %foo.Frame, ptr %2, i32 0, i32 1130 store ptr @foo.destroy, ptr %destroy.addr, align 8131 br label %AllocaSpillBB132 133AllocaSpillBB: ; preds = %entry134 br label %PostSpill135 136PostSpill: ; preds = %AllocaSpillBB137 br label %CoroSave138 139CoroSave: ; preds = %PostSpill140 %index.addr1 = getelementptr inbounds nuw %foo.Frame, ptr %2, i32 0, i32 2141 store i1 false, ptr %index.addr1, align 1142 br label %CoroSuspend143 144CoroSuspend: ; preds = %CoroSave145 br label %resume.0.landing146 147resume.0.landing: ; preds = %CoroSuspend148 br label %AfterCoroSuspend149 150AfterCoroSuspend: ; preds = %resume.0.landing151 ret void152}153 154attributes #0 = { presplitcoroutine }155attributes #1 = { mustprogress nocallback nofree nosync nounwind willreturn memory(argmem: read) }156attributes #2 = { nounwind }157attributes #3 = { nomerge nounwind }158attributes #4 = { coro_elide_safe }159