1*24e53b01SChuanqi Xu; RUN: opt < %s -passes='module(coro-early),cgscc(coro-split<reuse-storage>),function(sroa)' -S | FileCheck %s 2eb51dd71SChuanqi Xu 3eb51dd71SChuanqi Xu; Checks whether the dbg.declare for `__promise` remains valid under O2. 4eb51dd71SChuanqi Xu 5eb51dd71SChuanqi Xu; CHECK-LABEL: define internal fastcc void @f.resume({{.*}}) 6eb51dd71SChuanqi Xu; CHECK: entry.resume: 7eb51dd71SChuanqi Xu; CHECK: call void @llvm.dbg.declare(metadata %f.Frame* %FramePtr, metadata ![[PROMISEVAR_RESUME:[0-9]+]], metadata !DIExpression( 8eb51dd71SChuanqi Xu; 9eb51dd71SChuanqi Xu; CHECK: ![[PROMISEVAR_RESUME]] = !DILocalVariable(name: "__promise" 10eb51dd71SChuanqi Xu%promise_type = type { i32, i32, double } 11eb51dd71SChuanqi Xu 12735e6c40SChuanqi Xudefine void @f() presplitcoroutine !dbg !8 { 13eb51dd71SChuanqi Xuentry: 14eb51dd71SChuanqi Xu %__promise = alloca %promise_type, align 8 15eb51dd71SChuanqi Xu %0 = bitcast %promise_type* %__promise to i8* 16eb51dd71SChuanqi Xu %id = call token @llvm.coro.id(i32 16, i8* %0, i8* null, i8* null) 17eb51dd71SChuanqi Xu %alloc = call i1 @llvm.coro.alloc(token %id) 18eb51dd71SChuanqi Xu br i1 %alloc, label %coro.alloc, label %coro.init 19eb51dd71SChuanqi Xu 20eb51dd71SChuanqi Xucoro.alloc: ; preds = %entry 21eb51dd71SChuanqi Xu %size = call i64 @llvm.coro.size.i64() 22eb51dd71SChuanqi Xu %memory = call i8* @new(i64 %size) 23eb51dd71SChuanqi Xu br label %coro.init 24eb51dd71SChuanqi Xu 25eb51dd71SChuanqi Xucoro.init: ; preds = %coro.alloc, %entry 26eb51dd71SChuanqi Xu %phi.entry.alloc = phi i8* [ null, %entry ], [ %memory, %coro.alloc ] 27eb51dd71SChuanqi Xu %begin = call i8* @llvm.coro.begin(token %id, i8* %phi.entry.alloc) 28eb51dd71SChuanqi Xu call void @llvm.dbg.declare(metadata %promise_type* %__promise, metadata !6, metadata !DIExpression()), !dbg !18 29eb51dd71SChuanqi Xu %i.i = getelementptr inbounds %promise_type, %promise_type* %__promise, i64 0, i32 0 30eb51dd71SChuanqi Xu store i32 1, i32* %i.i, align 8 31eb51dd71SChuanqi Xu %j.i = getelementptr inbounds %promise_type, %promise_type* %__promise, i64 0, i32 1 32eb51dd71SChuanqi Xu store i32 2, i32* %j.i, align 4 33eb51dd71SChuanqi Xu %k.i = getelementptr inbounds %promise_type, %promise_type* %__promise, i64 0, i32 2 34eb51dd71SChuanqi Xu store double 3.000000e+00, double* %k.i, align 8 35eb51dd71SChuanqi Xu %ready = call i1 @await_ready() 36eb51dd71SChuanqi Xu br i1 %ready, label %init.ready, label %init.suspend 37eb51dd71SChuanqi Xu 38eb51dd71SChuanqi Xuinit.suspend: ; preds = %coro.init 39eb51dd71SChuanqi Xu %save = call token @llvm.coro.save(i8* null) 40eb51dd71SChuanqi Xu call void @await_suspend() 41eb51dd71SChuanqi Xu %suspend = call i8 @llvm.coro.suspend(token %save, i1 false) 42eb51dd71SChuanqi Xu switch i8 %suspend, label %coro.ret [ 43eb51dd71SChuanqi Xu i8 0, label %init.ready 44eb51dd71SChuanqi Xu i8 1, label %init.cleanup 45eb51dd71SChuanqi Xu ] 46eb51dd71SChuanqi Xu 47eb51dd71SChuanqi Xuinit.cleanup: ; preds = %init.suspend 48eb51dd71SChuanqi Xu br label %cleanup 49eb51dd71SChuanqi Xu 50eb51dd71SChuanqi Xuinit.ready: ; preds = %init.suspend, %coro.init 51eb51dd71SChuanqi Xu call void @await_resume() 52eb51dd71SChuanqi Xu %ready.again = call zeroext i1 @await_ready() 53eb51dd71SChuanqi Xu br i1 %ready.again, label %await.ready, label %await.suspend 54eb51dd71SChuanqi Xu 55eb51dd71SChuanqi Xuawait.suspend: ; preds = %init.ready 56eb51dd71SChuanqi Xu %save.again = call token @llvm.coro.save(i8* null) 57eb51dd71SChuanqi Xu %from.address = call i8* @from_address(i8* %begin) 58eb51dd71SChuanqi Xu call void @await_suspend() 59eb51dd71SChuanqi Xu %suspend.again = call i8 @llvm.coro.suspend(token %save.again, i1 false) 60eb51dd71SChuanqi Xu switch i8 %suspend.again, label %coro.ret [ 61eb51dd71SChuanqi Xu i8 0, label %await.ready 62eb51dd71SChuanqi Xu i8 1, label %await.cleanup 63eb51dd71SChuanqi Xu ] 64eb51dd71SChuanqi Xu 65eb51dd71SChuanqi Xuawait.cleanup: ; preds = %await.suspend 66eb51dd71SChuanqi Xu br label %cleanup 67eb51dd71SChuanqi Xu 68eb51dd71SChuanqi Xuawait.ready: ; preds = %await.suspend, %init.ready 69eb51dd71SChuanqi Xu call void @await_resume() 70eb51dd71SChuanqi Xu call void @return_void() 71eb51dd71SChuanqi Xu br label %coro.final 72eb51dd71SChuanqi Xu 73eb51dd71SChuanqi Xucoro.final: ; preds = %await.ready 74eb51dd71SChuanqi Xu call void @final_suspend() 75eb51dd71SChuanqi Xu %coro.final.await_ready = call i1 @await_ready() 76eb51dd71SChuanqi Xu br i1 %coro.final.await_ready, label %final.ready, label %final.suspend 77eb51dd71SChuanqi Xu 78eb51dd71SChuanqi Xufinal.suspend: ; preds = %coro.final 79eb51dd71SChuanqi Xu %final.suspend.coro.save = call token @llvm.coro.save(i8* null) 80eb51dd71SChuanqi Xu %final.suspend.from_address = call i8* @from_address(i8* %begin) 81eb51dd71SChuanqi Xu call void @await_suspend() 82eb51dd71SChuanqi Xu %final.suspend.coro.suspend = call i8 @llvm.coro.suspend(token %final.suspend.coro.save, i1 true) 83eb51dd71SChuanqi Xu switch i8 %final.suspend.coro.suspend, label %coro.ret [ 84eb51dd71SChuanqi Xu i8 0, label %final.ready 85eb51dd71SChuanqi Xu i8 1, label %final.cleanup 86eb51dd71SChuanqi Xu ] 87eb51dd71SChuanqi Xu 88eb51dd71SChuanqi Xufinal.cleanup: ; preds = %final.suspend 89eb51dd71SChuanqi Xu br label %cleanup 90eb51dd71SChuanqi Xu 91eb51dd71SChuanqi Xufinal.ready: ; preds = %final.suspend, %coro.final 92eb51dd71SChuanqi Xu call void @await_resume() 93eb51dd71SChuanqi Xu br label %cleanup 94eb51dd71SChuanqi Xu 95eb51dd71SChuanqi Xucleanup: ; preds = %final.ready, %final.cleanup, %await.cleanup, %init.cleanup 96eb51dd71SChuanqi Xu %cleanup.dest.slot.0 = phi i32 [ 0, %final.ready ], [ 2, %final.cleanup ], [ 2, %await.cleanup ], [ 2, %init.cleanup ] 97eb51dd71SChuanqi Xu %free.memory = call i8* @llvm.coro.free(token %id, i8* %begin) 98eb51dd71SChuanqi Xu %free = icmp ne i8* %free.memory, null 99eb51dd71SChuanqi Xu br i1 %free, label %coro.free, label %after.coro.free 100eb51dd71SChuanqi Xu 101eb51dd71SChuanqi Xucoro.free: ; preds = %cleanup 102eb51dd71SChuanqi Xu call void @delete(i8* %free.memory) 103eb51dd71SChuanqi Xu br label %after.coro.free 104eb51dd71SChuanqi Xu 105eb51dd71SChuanqi Xuafter.coro.free: ; preds = %coro.free, %cleanup 106eb51dd71SChuanqi Xu switch i32 %cleanup.dest.slot.0, label %unreachable [ 107eb51dd71SChuanqi Xu i32 0, label %cleanup.cont 108eb51dd71SChuanqi Xu i32 2, label %coro.ret 109eb51dd71SChuanqi Xu ] 110eb51dd71SChuanqi Xu 111eb51dd71SChuanqi Xucleanup.cont: ; preds = %after.coro.free 112eb51dd71SChuanqi Xu br label %coro.ret 113eb51dd71SChuanqi Xu 114eb51dd71SChuanqi Xucoro.ret: ; preds = %cleanup.cont, %after.coro.free, %final.suspend, %await.suspend, %init.suspend 115eb51dd71SChuanqi Xu %end = call i1 @llvm.coro.end(i8* null, i1 false) 116eb51dd71SChuanqi Xu ret void 117eb51dd71SChuanqi Xu 118eb51dd71SChuanqi Xuunreachable: ; preds = %after.coro.free 119eb51dd71SChuanqi Xu unreachable 120eb51dd71SChuanqi Xu 121eb51dd71SChuanqi Xu} 122eb51dd71SChuanqi Xu 123eb51dd71SChuanqi Xudeclare void @llvm.dbg.declare(metadata, metadata, metadata) 124eb51dd71SChuanqi Xudeclare token @llvm.coro.id(i32, i8* readnone, i8* nocapture readonly, i8*) 125eb51dd71SChuanqi Xudeclare i1 @llvm.coro.alloc(token) 126eb51dd71SChuanqi Xudeclare i64 @llvm.coro.size.i64() 127eb51dd71SChuanqi Xudeclare token @llvm.coro.save(i8*) 128eb51dd71SChuanqi Xudeclare i8* @llvm.coro.begin(token, i8* writeonly) 129eb51dd71SChuanqi Xudeclare i8 @llvm.coro.suspend(token, i1) 130eb51dd71SChuanqi Xudeclare i8* @llvm.coro.free(token, i8* nocapture readonly) 131eb51dd71SChuanqi Xudeclare i1 @llvm.coro.end(i8*, i1) 132eb51dd71SChuanqi Xu 133eb51dd71SChuanqi Xudeclare i8* @new(i64) 134eb51dd71SChuanqi Xudeclare void @delete(i8*) 135eb51dd71SChuanqi Xudeclare i1 @await_ready() 136eb51dd71SChuanqi Xudeclare void @await_suspend() 137eb51dd71SChuanqi Xudeclare void @await_resume() 138eb51dd71SChuanqi Xudeclare void @print(i32) 139eb51dd71SChuanqi Xudeclare i8* @from_address(i8*) 140eb51dd71SChuanqi Xudeclare void @return_void() 141eb51dd71SChuanqi Xudeclare void @final_suspend() 142eb51dd71SChuanqi Xu 143eb51dd71SChuanqi Xu!llvm.dbg.cu = !{!0} 144eb51dd71SChuanqi Xu!llvm.linker.options = !{} 145eb51dd71SChuanqi Xu!llvm.module.flags = !{!3, !4} 146eb51dd71SChuanqi Xu!llvm.ident = !{!5} 147eb51dd71SChuanqi Xu 148eb51dd71SChuanqi Xu!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "clang version 11.0.0", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !2, splitDebugInlining: false, nameTableKind: None) 149eb51dd71SChuanqi Xu!1 = !DIFile(filename: "coro-debug.cpp", directory: ".") 150eb51dd71SChuanqi Xu!2 = !{} 151eb51dd71SChuanqi Xu!3 = !{i32 7, !"Dwarf Version", i32 4} 152eb51dd71SChuanqi Xu!4 = !{i32 2, !"Debug Info Version", i32 3} 153eb51dd71SChuanqi Xu!5 = !{!"clang version 11.0.0"} 154eb51dd71SChuanqi Xu!6 = !DILocalVariable(name: "__promise", scope: !7, file: !1, line: 24, type: !10) 155eb51dd71SChuanqi Xu!7 = distinct !DILexicalBlock(scope: !8, file: !1, line: 23, column: 12) 156eb51dd71SChuanqi Xu!8 = distinct !DISubprogram(name: "foo", linkageName: "_Z3foov", scope: !8, file: !1, line: 23, type: !9, scopeLine: 23, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2) 157eb51dd71SChuanqi Xu!9 = !DISubroutineType(types: !2) 158eb51dd71SChuanqi Xu!10 = !DIDerivedType(tag: DW_TAG_typedef, name: "promise_type", scope: !8, file: !1, line: 15, baseType: !11) 159eb51dd71SChuanqi Xu!11 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "promise_type", scope: !8, file: !1, line: 10, size: 128, flags: DIFlagTypePassByValue | DIFlagNonTrivial, elements: !12, identifier: "_ZTSN4coro12promise_typeE") 160eb51dd71SChuanqi Xu!12 = !{!13, !14, !15} 161eb51dd71SChuanqi Xu!13 = !DIDerivedType(tag: DW_TAG_member, name: "i", scope: !8, file: !1, line: 10, baseType: !16, size: 32) 162eb51dd71SChuanqi Xu!14 = !DIDerivedType(tag: DW_TAG_member, name: "j", scope: !8, file: !1, line: 10, baseType: !16, size: 32, offset: 32) 163eb51dd71SChuanqi Xu!15 = !DIDerivedType(tag: DW_TAG_member, name: "k", scope: !8, file: !1, line: 10, baseType: !17, size: 64, offset: 64) 164eb51dd71SChuanqi Xu!16 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) 165eb51dd71SChuanqi Xu!17 = !DIBasicType(name: "double", size: 64, encoding: DW_ATE_float) 166eb51dd71SChuanqi Xu!18 = !DILocation(line: 0, scope: !7) 167eb51dd71SChuanqi Xu 168eb51dd71SChuanqi Xu 169eb51dd71SChuanqi Xu 170eb51dd71SChuanqi Xu 171eb51dd71SChuanqi Xu 172eb51dd71SChuanqi Xu 173