1*71fbfb49SHeejin Ahn; RUN: llc -verify-machineinstrs < %s | FileCheck %s 2*71fbfb49SHeejin Ahn; RUN: llc -filetype=obj %s -o - | llvm-dwarfdump - | FileCheck %s --check-prefix DWARF 32b7fe086SWouter van Oortmerssen 42b7fe086SWouter van Oortmerssen; Input C code: 52b7fe086SWouter van Oortmerssen 62b7fe086SWouter van Oortmerssen; int i = input(); // Nested case 72b7fe086SWouter van Oortmerssen; int j = input(); // Trivial def-use. 82b7fe086SWouter van Oortmerssen; output(i, j); 92b7fe086SWouter van Oortmerssen 102b7fe086SWouter van Oortmerssen; The ll below generates 330 lines of .S, so relevant parts that the 112b7fe086SWouter van Oortmerssen; WebAssemblyDebugFixup pass affects: 122b7fe086SWouter van Oortmerssen 132b7fe086SWouter van Oortmerssen; CHECK: call input 142b7fe086SWouter van Oortmerssen; CHECK: .Ltmp0: 152b7fe086SWouter van Oortmerssen; CHECK: call input 162b7fe086SWouter van Oortmerssen; CHECK: .Ltmp1: 172b7fe086SWouter van Oortmerssen; CHECK: call output 182b7fe086SWouter van Oortmerssen; CHECK: .Ltmp2: 192b7fe086SWouter van Oortmerssen 202b7fe086SWouter van Oortmerssen; This defines variable "i" which is live on the stack between Ltmp0 and Ltmp2, 212b7fe086SWouter van Oortmerssen; 2 = TI_OPERAND_STACK and 0 = stack offset. 222b7fe086SWouter van Oortmerssen 232b7fe086SWouter van Oortmerssen; CHECK: .section .debug_loc,"",@ 242b7fe086SWouter van Oortmerssen; CHECK: .Ldebug_loc0: 252b7fe086SWouter van Oortmerssen; CHECK: .int32 .Ltmp0-.Lfunc_begin0 262b7fe086SWouter van Oortmerssen; CHECK: .int32 .Ltmp2-.Lfunc_begin0 272b7fe086SWouter van Oortmerssen; CHECK: .int16 4 # Loc expr size 282b7fe086SWouter van Oortmerssen; CHECK: .int8 237 # DW_OP_WASM_location 292b7fe086SWouter van Oortmerssen; CHECK: .int8 2 # 2 302b7fe086SWouter van Oortmerssen; CHECK: .int8 0 # 0 312b7fe086SWouter van Oortmerssen; CHECK: .int8 159 # DW_OP_stack_value 322b7fe086SWouter van Oortmerssen 332b7fe086SWouter van Oortmerssen; This defines variable "j" which is live on the stack between Ltmp1 and Ltmp2, 342b7fe086SWouter van Oortmerssen; 2 = TI_OPERAND_STACK and 1 = stack offset. 352b7fe086SWouter van Oortmerssen 362b7fe086SWouter van Oortmerssen; CHECK: .Ldebug_loc1: 372b7fe086SWouter van Oortmerssen; CHECK: .int32 .Ltmp1-.Lfunc_begin0 382b7fe086SWouter van Oortmerssen; CHECK: .int32 .Ltmp2-.Lfunc_begin0 392b7fe086SWouter van Oortmerssen; CHECK: .int16 4 # Loc expr size 402b7fe086SWouter van Oortmerssen; CHECK: .int8 237 # DW_OP_WASM_location 412b7fe086SWouter van Oortmerssen; CHECK: .int8 2 # 2 422b7fe086SWouter van Oortmerssen; CHECK: .int8 1 # 1 432b7fe086SWouter van Oortmerssen; CHECK: .int8 159 # DW_OP_stack_value 442b7fe086SWouter van Oortmerssen 452b7fe086SWouter van Oortmerssen 462b7fe086SWouter van Oortmerssensource_filename = "stackified.c" 472b7fe086SWouter van Oortmerssentarget triple = "wasm32-unknown-unknown" 482b7fe086SWouter van Oortmerssen 492b7fe086SWouter van Oortmerssendefine void @foo() !dbg !12 { 502b7fe086SWouter van Oortmerssenentry: 512b7fe086SWouter van Oortmerssen %call = call i32 @input(), !dbg !18 522b7fe086SWouter van Oortmerssen call void @llvm.dbg.value(metadata i32 %call, metadata !16, metadata !DIExpression()), !dbg !19 532b7fe086SWouter van Oortmerssen %call1 = call i32 @input(), !dbg !20 542b7fe086SWouter van Oortmerssen call void @llvm.dbg.value(metadata i32 %call1, metadata !17, metadata !DIExpression()), !dbg !19 552b7fe086SWouter van Oortmerssen call void @output(i32 %call, i32 %call1), !dbg !21 562b7fe086SWouter van Oortmerssen ret void, !dbg !22 572b7fe086SWouter van Oortmerssen} 582b7fe086SWouter van Oortmerssen 59*71fbfb49SHeejin Ahn; DebugFixup pass should not add a DBG_VALUE after the BR_IF instruction at the 60*71fbfb49SHeejin Ahn; end of the 'entry' BB, because it is not allowed to have more instructions 61*71fbfb49SHeejin Ahn; after a terminator and debug ranges are terminated at the end of a BB anyway. 62*71fbfb49SHeejin Ahn; If this passes 'llc -verify-machineinstrs', that means the DBG_VALUE 63*71fbfb49SHeejin Ahn; instruction is correctly omitted. 64*71fbfb49SHeejin Ahn 65*71fbfb49SHeejin Ahn; DWARF-LABEL: DW_AT_name ("no_dbg_value_after_terminator") 66*71fbfb49SHeejin Ahn; DWARF: DW_TAG_variable 67*71fbfb49SHeejin Ahn; DWARF-NEXT: DW_AT_location 68*71fbfb49SHeejin Ahn; DWARF-NEXT: [ 69*71fbfb49SHeejin Ahn; DWARF-NEXT: DW_AT_name ("myvar") 70*71fbfb49SHeejin Ahndefine void @no_dbg_value_after_terminator(i32 %a, i32 %b) !dbg !23 { 71*71fbfb49SHeejin Ahnentry: 72*71fbfb49SHeejin Ahn %cmp = icmp ne i32 %a, %b, !dbg !25 73*71fbfb49SHeejin Ahn call void @llvm.dbg.value(metadata i1 %cmp, metadata !27, metadata !DIExpression(DW_OP_LLVM_convert, 1, DW_ATE_unsigned, DW_OP_LLVM_convert, 8, DW_ATE_unsigned, DW_OP_stack_value)), !dbg !25 74*71fbfb49SHeejin Ahn br i1 %cmp, label %bb.1, label %bb.0, !dbg !25 75*71fbfb49SHeejin Ahn 76*71fbfb49SHeejin Ahnbb.0: ; preds = %entry 77*71fbfb49SHeejin Ahn unreachable 78*71fbfb49SHeejin Ahn 79*71fbfb49SHeejin Ahnbb.1: ; preds = %entry 80*71fbfb49SHeejin Ahn ret void 81*71fbfb49SHeejin Ahn} 82*71fbfb49SHeejin Ahn 832b7fe086SWouter van Oortmerssendeclare i32 @input() 842b7fe086SWouter van Oortmerssendeclare !dbg !4 void @output(i32, i32) 852b7fe086SWouter van Oortmerssendeclare void @llvm.dbg.value(metadata, metadata, metadata) 862b7fe086SWouter van Oortmerssen 872b7fe086SWouter van Oortmerssen!llvm.dbg.cu = !{!0} 882b7fe086SWouter van Oortmerssen!llvm.module.flags = !{!8, !9, !10} 892b7fe086SWouter van Oortmerssen!llvm.ident = !{!11} 902b7fe086SWouter van Oortmerssen 912b7fe086SWouter van Oortmerssen!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 11.0.0 (https://github.com/llvm/llvm-project.git ed7aaf832444411ce93aa0443425ce401f5c7a8e)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None) 922b7fe086SWouter van Oortmerssen!1 = !DIFile(filename: "stackified.c", directory: "C:\\stuff\\llvm-project") 932b7fe086SWouter van Oortmerssen!2 = !{} 942b7fe086SWouter van Oortmerssen!3 = !{!4} 952b7fe086SWouter van Oortmerssen!4 = !DISubprogram(name: "output", scope: !1, file: !1, line: 2, type: !5, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized, retainedNodes: !2) 962b7fe086SWouter van Oortmerssen!5 = !DISubroutineType(types: !6) 972b7fe086SWouter van Oortmerssen!6 = !{null, !7, !7} 982b7fe086SWouter van Oortmerssen!7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) 992b7fe086SWouter van Oortmerssen!8 = !{i32 7, !"Dwarf Version", i32 4} 1002b7fe086SWouter van Oortmerssen!9 = !{i32 2, !"Debug Info Version", i32 3} 1012b7fe086SWouter van Oortmerssen!10 = !{i32 1, !"wchar_size", i32 4} 1022b7fe086SWouter van Oortmerssen!11 = !{!"clang version 11.0.0 (https://github.com/llvm/llvm-project.git ed7aaf832444411ce93aa0443425ce401f5c7a8e)"} 1032b7fe086SWouter van Oortmerssen!12 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 3, type: !13, scopeLine: 3, flags: DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !15) 1042b7fe086SWouter van Oortmerssen!13 = !DISubroutineType(types: !14) 1052b7fe086SWouter van Oortmerssen!14 = !{null} 1062b7fe086SWouter van Oortmerssen!15 = !{!16, !17} 1072b7fe086SWouter van Oortmerssen!16 = !DILocalVariable(name: "i", scope: !12, file: !1, line: 4, type: !7) 1082b7fe086SWouter van Oortmerssen!17 = !DILocalVariable(name: "j", scope: !12, file: !1, line: 5, type: !7) 1092b7fe086SWouter van Oortmerssen!18 = !DILocation(line: 4, column: 11, scope: !12) 1102b7fe086SWouter van Oortmerssen!19 = !DILocation(line: 0, scope: !12) 1112b7fe086SWouter van Oortmerssen!20 = !DILocation(line: 5, column: 11, scope: !12) 1122b7fe086SWouter van Oortmerssen!21 = !DILocation(line: 6, column: 3, scope: !12) 1132b7fe086SWouter van Oortmerssen!22 = !DILocation(line: 7, column: 1, scope: !12) 114*71fbfb49SHeejin Ahn!23 = distinct !DISubprogram(name: "no_dbg_value_after_terminator", scope: null, type: !24, spFlags: DISPFlagDefinition, unit: !0) 115*71fbfb49SHeejin Ahn!24 = !DISubroutineType(types: !2) 116*71fbfb49SHeejin Ahn!25 = !DILocation(line: 0, scope: !26) 117*71fbfb49SHeejin Ahn!26 = distinct !DILexicalBlock(scope: !23) 118*71fbfb49SHeejin Ahn!27 = !DILocalVariable(name: "myvar", scope: !26, type: !28) 119*71fbfb49SHeejin Ahn!28 = !DIBasicType(name: "bool", size: 8, encoding: DW_ATE_boolean) 120