brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.9 KiB · 690e011 Raw
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