12e29c91bSMogball; RUN: opt -mtriple='arm64-' %s -S -passes='module(coro-early),cgscc(coro-split,simplifycfg)' -o - | FileCheck %s 22e29c91bSMogball; RUN: opt -mtriple='x86_64' %s -S -passes='module(coro-early),cgscc(coro-split,simplifycfg)' -o - | FileCheck %s 32e29c91bSMogball; RUN: opt -mtriple='i386-' %s -S -passes='module(coro-early),cgscc(coro-split,simplifycfg)' -o - | FileCheck %s --check-prefix=NOENTRY 42e29c91bSMogball; RUN: opt -mtriple='armv7-' %s -S -passes='module(coro-early),cgscc(coro-split,simplifycfg)' -o - | FileCheck %s --check-prefix=NOENTRY 5fd8fa31cSOrlando Cazalet-Hyams 6fd8fa31cSOrlando Cazalet-Hyams;; Replicate those tests with non-instruction debug markers. 72e29c91bSMogball; RUN: opt --try-experimental-debuginfo-iterators -mtriple='arm64-' %s -S -passes='module(coro-early),cgscc(coro-split,simplifycfg)' -o - | FileCheck %s 82e29c91bSMogball; RUN: opt --try-experimental-debuginfo-iterators -mtriple='x86_64' %s -S -passes='module(coro-early),cgscc(coro-split,simplifycfg)' -o - | FileCheck %s 92e29c91bSMogball; RUN: opt --try-experimental-debuginfo-iterators -mtriple='i386-' %s -S -passes='module(coro-early),cgscc(coro-split,simplifycfg)' -o - | FileCheck %s --check-prefix=NOENTRY 102e29c91bSMogball; RUN: opt --try-experimental-debuginfo-iterators -mtriple='armv7-' %s -S -passes='module(coro-early),cgscc(coro-split,simplifycfg)' -o - | FileCheck %s --check-prefix=NOENTRY 11fd8fa31cSOrlando Cazalet-Hyams 12aefa9ff3SFelipe de Azevedo Piovezan; NOENTRY-NOT: OP_llvm_entry_value 13aefa9ff3SFelipe de Azevedo Piovezan 14617c9d59SFelipe de Azevedo Piovezantarget datalayout = "e-m:o-i64:64-i128:128-n32:64-S128" 15617c9d59SFelipe de Azevedo Piovezan 16617c9d59SFelipe de Azevedo Piovezan; This coroutine has one split point and two variables defined by: 17617c9d59SFelipe de Azevedo Piovezan; %var_with_dbg_value, which has multiple dbg.value intrinsics associated with 18617c9d59SFelipe de Azevedo Piovezan; it, one per split point. 19617c9d59SFelipe de Azevedo Piovezan; %var_with_dbg_declare, which has a single dbg.declare intrinsic associated 20617c9d59SFelipe de Azevedo Piovezan; with it at the coroutine entry. 21617c9d59SFelipe de Azevedo Piovezan; We check that, for each funclet, the debug intrinsics are propagated properly AND that 22617c9d59SFelipe de Azevedo Piovezan; an `entry_value` operation is created. 23617c9d59SFelipe de Azevedo Piovezandefine swifttailcc void @coroutineA(ptr swiftasync %arg) !dbg !48 { 24617c9d59SFelipe de Azevedo Piovezan %var_with_dbg_value = alloca ptr, align 8 25617c9d59SFelipe de Azevedo Piovezan %var_with_dbg_declare = alloca ptr, align 8 26617c9d59SFelipe de Azevedo Piovezan call void @llvm.dbg.declare(metadata ptr %var_with_dbg_declare, metadata !500, metadata !DIExpression()), !dbg !54 27617c9d59SFelipe de Azevedo Piovezan call void @llvm.dbg.value(metadata ptr %var_with_dbg_value, metadata !50, metadata !DIExpression(DW_OP_deref)), !dbg !54 28617c9d59SFelipe de Azevedo Piovezan %i2 = call token @llvm.coro.id.async(i32 16, i32 16, i32 0, ptr nonnull @coroutineATu) 29617c9d59SFelipe de Azevedo Piovezan %i3 = call ptr @llvm.coro.begin(token %i2, ptr null) 30617c9d59SFelipe de Azevedo Piovezan; CHECK-LABEL: define {{.*}} @coroutineA( 31617c9d59SFelipe de Azevedo Piovezan; CHECK-SAME: ptr swiftasync %[[frame_ptr:.*]]) 3209457270SStephen Tozer; CHECK: #dbg_declare(ptr %[[frame_ptr]], {{.*}} !DIExpression( 337a91af4fSShubham Sandeep Rastogi; CHECK-SAME: DW_OP_plus_uconst, 24) 3409457270SStephen Tozer; CHECK: #dbg_value(ptr %[[frame_ptr]], {{.*}} !DIExpression( 358aa038abSFelipe de Azevedo Piovezan; CHECK-SAME: DW_OP_plus_uconst, 16, DW_OP_deref) 36617c9d59SFelipe de Azevedo Piovezan; CHECK: call {{.*}} @swift_task_switch 37617c9d59SFelipe de Azevedo Piovezan 38617c9d59SFelipe de Azevedo Piovezan %i7 = call ptr @llvm.coro.async.resume(), !dbg !54 39617c9d59SFelipe de Azevedo Piovezan %i10 = call { ptr } (i32, ptr, ptr, ...) @llvm.coro.suspend.async.sl_p0s(i32 0, ptr %i7, ptr nonnull @__swift_async_resume_get_context, ptr nonnull @coroutineA.1, ptr %i7, i64 0, i64 0, ptr %arg), !dbg !54 40*ddcc6013SFelipe de Azevedo Piovezan %i11 = extractvalue { ptr } %i10, 0, !dbg !55 41*ddcc6013SFelipe de Azevedo Piovezan %i12 = call ptr @__swift_async_resume_get_context(ptr %i11), !dbg !55 42*ddcc6013SFelipe de Azevedo Piovezan call void @dont_optimize(ptr %var_with_dbg_value, ptr %var_with_dbg_declare), !dbg !100 43617c9d59SFelipe de Azevedo Piovezan call void @llvm.dbg.value(metadata ptr %var_with_dbg_value, metadata !50, metadata !DIExpression(DW_OP_deref)), !dbg !54 44617c9d59SFelipe de Azevedo Piovezan %i17 = load i32, ptr getelementptr inbounds (<{i32, i32}>, ptr @coroutineBTu, i64 0, i32 1), align 8, !dbg !54 45eb6dee61SFelipe de Azevedo Piovezan call void @llvm.dbg.value(metadata !DIArgList(ptr %var_with_dbg_value, i32 %i17), metadata !501, metadata !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_plus, DW_OP_deref)), !dbg !54 46617c9d59SFelipe de Azevedo Piovezan %i18 = zext i32 %i17 to i64, !dbg !54 47617c9d59SFelipe de Azevedo Piovezan %i19 = call swiftcc ptr @swift_task_alloc(i64 %i18), !dbg !54 48617c9d59SFelipe de Azevedo Piovezan; CHECK-NOT: define 49617c9d59SFelipe de Azevedo Piovezan; CHECK-LABEL: define {{.*}} @coroutineATY0_( 50*ddcc6013SFelipe de Azevedo Piovezan; CHECK-SAME: ptr swiftasync %[[frame_ptr:.*]]) !dbg ![[ATY0:[0-9]*]] 5109457270SStephen Tozer; CHECK: #dbg_declare(ptr %[[frame_ptr]], {{.*}} !DIExpression( 527a91af4fSShubham Sandeep Rastogi; CHECK-SAME: DW_OP_LLVM_entry_value, 1, DW_OP_plus_uconst, 24) 5309457270SStephen Tozer; CHECK: #dbg_value(ptr %[[frame_ptr]], {{.*}} !DIExpression( 54617c9d59SFelipe de Azevedo Piovezan; CHECK-SAME: DW_OP_LLVM_entry_value, 1, DW_OP_plus_uconst, 16, DW_OP_deref) 5509457270SStephen Tozer; CHECK: #dbg_value(!DIArgList(ptr %[[frame_ptr]], i32 %{{.*}}), {{.*}} !DIExpression( 56eb6dee61SFelipe de Azevedo Piovezan; CHECK-SAME: DW_OP_LLVM_arg, 0, DW_OP_plus_uconst, 16, DW_OP_LLVM_arg, 1, DW_OP_plus, DW_OP_deref) 57617c9d59SFelipe de Azevedo Piovezan; CHECK: call {{.*}} @coroutineB 58617c9d59SFelipe de Azevedo Piovezan 59617c9d59SFelipe de Azevedo Piovezan %i23 = call ptr @llvm.coro.async.resume(), !dbg !54 60617c9d59SFelipe de Azevedo Piovezan %i25 = getelementptr inbounds <{ ptr, ptr }>, ptr %i19, i64 0, i32 1, !dbg !54 61617c9d59SFelipe de Azevedo Piovezan store ptr %i23, ptr %i25, align 8, !dbg !54 62617c9d59SFelipe de Azevedo Piovezan %i27 = call { ptr } (i32, ptr, ptr, ...) @llvm.coro.suspend.async.sl_p0s(i32 0, ptr %i23, ptr nonnull @__swift_async_resume_project_context, ptr nonnull @coroutineA.0, ptr nonnull @coroutineB, ptr nonnull %i19), !dbg !54 63617c9d59SFelipe de Azevedo Piovezan %i28 = extractvalue { ptr } %i27, 0, !dbg !54 64617c9d59SFelipe de Azevedo Piovezan %i29 = call ptr @__swift_async_resume_project_context(ptr %i28), !dbg !54 65617c9d59SFelipe de Azevedo Piovezan call swiftcc void @swift_task_dealloc(ptr nonnull %i19), !dbg !54 66617c9d59SFelipe de Azevedo Piovezan call void @dont_optimize(ptr %var_with_dbg_value, ptr %var_with_dbg_declare) 67617c9d59SFelipe de Azevedo Piovezan call void @llvm.dbg.value(metadata ptr %var_with_dbg_value, metadata !50, metadata !DIExpression(DW_OP_deref)), !dbg !54 68617c9d59SFelipe de Azevedo Piovezan; CHECK-NOT: define 69617c9d59SFelipe de Azevedo Piovezan; CHECK-LABEL: define {{.*}} @coroutineATQ1_( 70617c9d59SFelipe de Azevedo Piovezan; CHECK-SAME: ptr swiftasync %[[frame_ptr:.*]]) 71617c9d59SFelipe de Azevedo Piovezan; Note the extra level of indirection that shows up here! 7209457270SStephen Tozer; CHECK: #dbg_declare(ptr %[[frame_ptr]], {{.*}} !DIExpression( 737a91af4fSShubham Sandeep Rastogi; CHECK-SAME: DW_OP_LLVM_entry_value, 1, DW_OP_deref, DW_OP_plus_uconst, 24) 7409457270SStephen Tozer; CHECK: #dbg_value(ptr %[[frame_ptr]], {{.*}} !DIExpression( 75617c9d59SFelipe de Azevedo Piovezan; CHECK-SAME: DW_OP_LLVM_entry_value, 1, DW_OP_deref, DW_OP_plus_uconst, 16, DW_OP_deref) 76617c9d59SFelipe de Azevedo Piovezan; CHECK: call {{.*}} @swift_task_switch 77617c9d59SFelipe de Azevedo Piovezan 78617c9d59SFelipe de Azevedo Piovezan %i31 = call ptr @llvm.coro.async.resume(), !dbg !54 79617c9d59SFelipe de Azevedo Piovezan %i33 = call { ptr } (i32, ptr, ptr, ...) @llvm.coro.suspend.async.sl_p0s(i32 0, ptr %i31, ptr nonnull @__swift_async_resume_get_context, ptr nonnull @coroutineA.1, ptr %i31, i64 0, i64 0, ptr %i29), !dbg !54 80617c9d59SFelipe de Azevedo Piovezan %i34 = extractvalue { ptr } %i33, 0, !dbg !54 81617c9d59SFelipe de Azevedo Piovezan %i35 = call ptr @__swift_async_resume_get_context(ptr %i34), !dbg !54 82617c9d59SFelipe de Azevedo Piovezan %i45 = call i1 (ptr, i1, ...) @llvm.coro.end.async(ptr %i3, i1 false, ptr nonnull @coroutineA.0.1, ptr undef, ptr undef), !dbg !54 83617c9d59SFelipe de Azevedo Piovezan unreachable, !dbg !54 84617c9d59SFelipe de Azevedo Piovezan; CHECK-NOT: define 85617c9d59SFelipe de Azevedo Piovezan; CHECK-LABEL: define {{.*}} @coroutineATY2_( 86617c9d59SFelipe de Azevedo Piovezan; CHECK-SAME: ptr swiftasync %[[frame_ptr:.*]]) 8709457270SStephen Tozer; CHECK: #dbg_declare(ptr %[[frame_ptr]], {{.*}} !DIExpression( 887a91af4fSShubham Sandeep Rastogi; CHECK-SAME: DW_OP_LLVM_entry_value, 1, DW_OP_plus_uconst, 24) 89617c9d59SFelipe de Azevedo Piovezan} 90617c9d59SFelipe de Azevedo Piovezan 91*ddcc6013SFelipe de Azevedo Piovezan; CHECK: ![[ATY0]] = {{.*}}DISubprogram(linkageName: "coroutineATY0_", {{.*}} scopeLine: 42 92*ddcc6013SFelipe de Azevedo Piovezan 93617c9d59SFelipe de Azevedo Piovezan; Everything from here on is just support code for the coroutines. 94617c9d59SFelipe de Azevedo Piovezan 95617c9d59SFelipe de Azevedo Piovezan@coroutineBTu = global <{i32, i32}> <{ i32 trunc (i64 sub (i64 ptrtoint (ptr @"coroutineB" to i64), i64 ptrtoint (ptr @"coroutineBTu" to i64)) to i32), i32 16 }>, align 8 96617c9d59SFelipe de Azevedo Piovezan@coroutineATu = global <{i32, i32}> <{ i32 trunc (i64 sub (i64 ptrtoint (ptr @"coroutineA" to i64), i64 ptrtoint (ptr @"coroutineATu" to i64)) to i32), i32 16 }>, align 8 97617c9d59SFelipe de Azevedo Piovezan 982e29c91bSMogballdefine weak_odr hidden ptr @__swift_async_resume_get_context(ptr %arg) !dbg !64 { 99617c9d59SFelipe de Azevedo Piovezan ret ptr %arg, !dbg !65 100617c9d59SFelipe de Azevedo Piovezan} 1012e29c91bSMogballdefine hidden swifttailcc void @coroutineA.1(ptr %arg, i64 %arg1, i64 %arg2, ptr %arg3) !dbg !66 { 102617c9d59SFelipe de Azevedo Piovezan musttail call swifttailcc void @swift_task_switch(ptr swiftasync %arg3, ptr %arg, i64 %arg1, i64 %arg2), !dbg !67 103617c9d59SFelipe de Azevedo Piovezan ret void, !dbg !67 104617c9d59SFelipe de Azevedo Piovezan} 105617c9d59SFelipe de Azevedo Piovezan 1062e29c91bSMogballdefine weak_odr hidden ptr @__swift_async_resume_project_context(ptr %arg) !dbg !68 { 107617c9d59SFelipe de Azevedo Piovezan %i1 = load ptr, ptr %arg, align 8, !dbg !69 108617c9d59SFelipe de Azevedo Piovezan %i2 = call ptr @llvm.swift.async.context.addr(), !dbg !69 109617c9d59SFelipe de Azevedo Piovezan store ptr %i1, ptr %i2, align 8, !dbg !69 110617c9d59SFelipe de Azevedo Piovezan ret ptr %i1, !dbg !69 111617c9d59SFelipe de Azevedo Piovezan} 1122e29c91bSMogballdefine hidden swifttailcc void @coroutineA.0(ptr %arg, ptr %arg1) !dbg !70 { 113617c9d59SFelipe de Azevedo Piovezan musttail call swifttailcc void %arg(ptr swiftasync %arg1), !dbg !71 114617c9d59SFelipe de Azevedo Piovezan ret void, !dbg !71 115617c9d59SFelipe de Azevedo Piovezan} 1162e29c91bSMogballdefine hidden swifttailcc void @coroutineA.0.1(ptr %arg, ptr %arg1) !dbg !72 { 117617c9d59SFelipe de Azevedo Piovezan musttail call swifttailcc void %arg(ptr swiftasync %arg1), !dbg !73 118617c9d59SFelipe de Azevedo Piovezan ret void, !dbg !73 119617c9d59SFelipe de Azevedo Piovezan} 1202e29c91bSMogballdefine swifttailcc void @coroutineB(ptr swiftasync %arg) !dbg !37 { 121617c9d59SFelipe de Azevedo Piovezan %i2 = call token @llvm.coro.id.async(i32 16, i32 16, i32 0, ptr nonnull @coroutineBTu) 122617c9d59SFelipe de Azevedo Piovezan %i3 = call ptr @llvm.coro.begin(token %i2, ptr null) 123617c9d59SFelipe de Azevedo Piovezan %i6 = getelementptr inbounds <{ ptr, ptr }>, ptr %arg, i64 0, i32 1, !dbg !42 124617c9d59SFelipe de Azevedo Piovezan %i712 = load ptr, ptr %i6, align 8, !dbg !42 125617c9d59SFelipe de Azevedo Piovezan %i10 = call i1 (ptr, i1, ...) @llvm.coro.end.async(ptr %i3, i1 false, ptr nonnull @coroutineB.0, ptr %i712, ptr %arg), !dbg !42 126617c9d59SFelipe de Azevedo Piovezan unreachable, !dbg !42 127617c9d59SFelipe de Azevedo Piovezan} 1282e29c91bSMogballdefine hidden swifttailcc void @coroutineB.0(ptr %arg, ptr %arg1) !dbg !44 { 129617c9d59SFelipe de Azevedo Piovezan musttail call swifttailcc void %arg(ptr swiftasync %arg1), !dbg !47 130617c9d59SFelipe de Azevedo Piovezan ret void, !dbg !47 131617c9d59SFelipe de Azevedo Piovezan} 132617c9d59SFelipe de Azevedo Piovezan 133617c9d59SFelipe de Azevedo Piovezandeclare i1 @llvm.coro.end.async(ptr, i1, ...) 134617c9d59SFelipe de Azevedo Piovezandeclare ptr @llvm.coro.async.resume() 135617c9d59SFelipe de Azevedo Piovezandeclare ptr @llvm.coro.begin(token, ptr writeonly) 136617c9d59SFelipe de Azevedo Piovezandeclare ptr @llvm.swift.async.context.addr() 137617c9d59SFelipe de Azevedo Piovezandeclare swiftcc ptr @swift_task_alloc(i64) 138617c9d59SFelipe de Azevedo Piovezandeclare swiftcc void @swift_task_dealloc(ptr) 139617c9d59SFelipe de Azevedo Piovezandeclare swifttailcc void @swift_task_switch(ptr, ptr, i64, i64) 140617c9d59SFelipe de Azevedo Piovezandeclare token @llvm.coro.id.async(i32, i32, i32, ptr) 141617c9d59SFelipe de Azevedo Piovezandeclare void @dont_optimize(ptr, ptr) 142617c9d59SFelipe de Azevedo Piovezandeclare void @llvm.dbg.declare(metadata, metadata, metadata) 143617c9d59SFelipe de Azevedo Piovezandeclare void @llvm.dbg.value(metadata, metadata, metadata) 144617c9d59SFelipe de Azevedo Piovezandeclare { ptr } @llvm.coro.suspend.async.sl_p0s(i32, ptr, ptr, ...) 145617c9d59SFelipe de Azevedo Piovezan 146617c9d59SFelipe de Azevedo Piovezan!llvm.module.flags = !{!6, !7} 147617c9d59SFelipe de Azevedo Piovezan!llvm.dbg.cu = !{!16} 148617c9d59SFelipe de Azevedo Piovezan 149617c9d59SFelipe de Azevedo Piovezan!6 = !{i32 7, !"Dwarf Version", i32 4} 150617c9d59SFelipe de Azevedo Piovezan!7 = !{i32 2, !"Debug Info Version", i32 3} 151617c9d59SFelipe de Azevedo Piovezan 152617c9d59SFelipe de Azevedo Piovezan!50 = !DILocalVariable(name: "k1", scope: !48, file: !17, line: 7, type: !53) 153617c9d59SFelipe de Azevedo Piovezan!500 = !DILocalVariable(name: "k2", scope: !48, file: !17, line: 7, type: !53) 154eb6dee61SFelipe de Azevedo Piovezan!501 = !DILocalVariable(name: "k3", scope: !48, file: !17, line: 7, type: !53) 155617c9d59SFelipe de Azevedo Piovezan!49 = !{!50, !500} 156617c9d59SFelipe de Azevedo Piovezan 157617c9d59SFelipe de Azevedo Piovezan!16 = distinct !DICompileUnit(language: DW_LANG_Swift, file: !17, producer: "", emissionKind: FullDebug) 158617c9d59SFelipe de Azevedo Piovezan!17 = !DIFile(filename: "blah", directory: "") 159617c9d59SFelipe de Azevedo Piovezan 160617c9d59SFelipe de Azevedo Piovezan!53 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "Klass") 161617c9d59SFelipe de Azevedo Piovezan!46 = !DISubroutineType(types: null) 162617c9d59SFelipe de Azevedo Piovezan 163617c9d59SFelipe de Azevedo Piovezan!64 = distinct !DISubprogram(linkageName: "blah", file: !17, type: !46, unit: !16) 164617c9d59SFelipe de Azevedo Piovezan!68 = distinct !DISubprogram(linkageName: "blah", file: !17, type: !46, unit: !16) 165617c9d59SFelipe de Azevedo Piovezan!66 = distinct !DISubprogram(linkageName: "coroutineA", file: !17, type: !46, unit: !16) 166617c9d59SFelipe de Azevedo Piovezan!70 = distinct !DISubprogram(linkageName: "coroutineA", file: !17, type: !46, unit: !16) 167617c9d59SFelipe de Azevedo Piovezan!72 = distinct !DISubprogram(linkageName: "coroutineA", file: !17, type: !46, unit: !16) 168617c9d59SFelipe de Azevedo Piovezan!48 = distinct !DISubprogram(linkageName: "coroutineA", file: !17, type: !46, unit: !16, retainedNodes: !49) 169617c9d59SFelipe de Azevedo Piovezan!37 = distinct !DISubprogram(linkageName: "coroutineB", file: !17, type: !46, unit: !16) 170617c9d59SFelipe de Azevedo Piovezan!44 = distinct !DISubprogram(linkageName: "coroutineB", file: !17, type: !46, unit: !16) 171617c9d59SFelipe de Azevedo Piovezan!65 = !DILocation(line: 0, scope: !64) 172617c9d59SFelipe de Azevedo Piovezan!67 = !DILocation(line: 0, scope: !66) 173617c9d59SFelipe de Azevedo Piovezan!69 = !DILocation(line: 0, scope: !68) 174617c9d59SFelipe de Azevedo Piovezan!71 = !DILocation(line: 0, scope: !70) 175617c9d59SFelipe de Azevedo Piovezan!73 = !DILocation(line: 0, scope: !72) 176617c9d59SFelipe de Azevedo Piovezan!54 = !DILocation(line: 6, scope: !48) 177*ddcc6013SFelipe de Azevedo Piovezan!55 = !DILocation(line: 0, scope: !48) 178617c9d59SFelipe de Azevedo Piovezan!42 = !DILocation(line: 3, scope: !37) 179617c9d59SFelipe de Azevedo Piovezan!47 = !DILocation(line: 0, scope: !44) 180*ddcc6013SFelipe de Azevedo Piovezan!100 = !DILocation(line: 42, scope: !48) 181