diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_diamond_move.mir b/llvm/test/DebugInfo/MIR/InstrRef/livedebugvalues_downgradefeedback_loop.mir copy from llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_diamond_move.mir copy to llvm/test/DebugInfo/MIR/InstrRef/livedebugvalues_downgradefeedback_loop.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_diamond_move.mir +++ b/llvm/test/DebugInfo/MIR/InstrRef/livedebugvalues_downgradefeedback_loop.mir @@ -1,21 +1,32 @@ --- | - ; RUN: llc %s -march=x86-64 -run-pass=livedebugvalues -o - | FileCheck %s -implicit-check-not=DBG_VALUE + ; RUN: llc %s -march=x86-64 -run-pass=livedebugvalues -o - -experimental-debug-variable-locations -emulate-old-livedebugvalues=0 | FileCheck %s -implicit-check-not=DBG_VALUE - ; Check that DBG_VALUE instructions are propagated into a loop with - ; diamond pattern but not beyond. + ; This test has two loop heads (bb1, bb2) and a PHI going into bb5. In bb2, + ; we need to explore / downgrade from the value of ebx def'd in the entry + ; block, through the first loop head, then propose and confirm a PHI at the + ; second loop head. + + ;; Checks represent each DBG_VALUE in the MIR below, and the a live-in + ;; DBG_VALUE at the start of each block added by LiveDebugValues. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $eax ; CHECK-LABEL: bb.1.bb1: - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx + ; CHECK: DBG_VALUE $ebx ; CHECK-LABEL: bb.2.bb2: - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx ; CHECK-LABEL: bb.3.bb3: - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx + ; CHECK: DBG_VALUE $ebx ; CHECK-LABEL: bb.4.bb4: - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx ; CHECK-LABEL: bb.5.bb5: - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx + ; CHECK-LABEL: bb.6: + ; CHECK: DBG_VALUE $ebx + ; CHECK-LABEL: bb.7: + ; CHECK: DBG_VALUE $ebx define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { entry: @@ -61,23 +72,29 @@ bb.0.entry: successors: %bb.1 $ebx = MOV32ri 0, debug-location !17 - DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 - bb.1.bb1: - successors: %bb.2, %bb.3 - $eax = MOV32ri 0, debug-location !17 + $eax = COPY $ebx DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 - JCC_1 %bb.3, 4, implicit killed $eflags + bb.1.bb1: + successors: %bb.2 + $eax = COPY $ebx, debug-location !17 + $ebx = COPY $ecx, debug-location !17 + DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 bb.2.bb2: - successors: %bb.4 - $ebx = MOV32ri 0, debug-location !17 - JMP_1 %bb.4 + successors: %bb.3, %bb.4 + JCC_1 %bb.4, 4, implicit $eflags bb.3.bb3: - successors: %bb.4 + successors: %bb.5 $ebx = MOV32ri 0, debug-location !17 + DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + JMP_1 %bb.5 bb.4.bb4: - successors: %bb.1, %bb.5 - $ebx = MOV32ri 0, debug-location !17 - JCC_1 %bb.1, 4, implicit killed $eflags + successors: %bb.5 bb.5.bb5: + successors: %bb.2, %bb.6 + JCC_1 %bb.2, 4, implicit killed $eflags + bb.6: + successors: %bb.1, %bb.7 + JCC_1 %bb.1, 4, implicit killed $eflags + bb.7: RETQ $eax, debug-location !17 ... diff --git a/llvm/test/DebugInfo/MIR/InstrRef/livedebugvalues_insensitive_downgrade.mir b/llvm/test/DebugInfo/MIR/InstrRef/livedebugvalues_insensitive_downgrade.mir new file mode 100644 --- /dev/null +++ b/llvm/test/DebugInfo/MIR/InstrRef/livedebugvalues_insensitive_downgrade.mir @@ -0,0 +1,112 @@ +--- | + ; RUN: llc %s -march=x86-64 -run-pass=livedebugvalues -o - | FileCheck %s --implicit-check-not=DBG_VALUE + ; RUN: llc %s -march=x86-64 -run-pass=livedebugvalues -o - -experimental-debug-variable-locations | FileCheck %s --implicit-check-not=DBG_VALUE + ; + ; No DBG_VALUEs should be propagated, as there's a loop between bb2 and bb3 + ; that defines $rdi without specifying it as being the variable value. Uses + ; implicit check-not in runlines above. + ; + ; CHECK-LABEL: bb.1.while.body + ; CHECK: DBG_VALUE + ; CHECK-NEXT: TEST8rr + ; CHECK-NEXT: JCC_1 + + ; ModuleID = 'multi-downgrade-but-not-sensitive.ll' + source_filename = "/fast/fs/llvm3/clang/lib/CodeGen/CoverageMappingGen.cpp" + target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" + target triple = "x86_64-unknown-linux-gnu" + + %"struct.std::pair.1976" = type { %"class.clang::SourceLocation", i32 } + %"class.clang::SourceLocation" = type { i32 } + + ; Function Attrs: nounwind uwtable + define weak_odr void @_ZSt17__merge_sort_loopIPSt4pairIN5clang14SourceLocationEjES4_lN9__gnu_cxx5__ops15_Iter_comp_iterIN4llvm11less_secondEEEEvT_SB_T0_T1_T2_(%"struct.std::pair.1976"* %__result) local_unnamed_addr !dbg !12 { + while.body.lr.ph: + br label %while.body, !dbg !17 + + while.body: ; preds = %while.body, %while.body.i, %while.body.lr.ph + %__result.addr.099 = phi %"struct.std::pair.1976"* [ %__result, %while.body.lr.ph ], [ %__result.addr.099, %while.body ], [ %incdec.ptr7.i, %while.body.i ] + call void @llvm.dbg.value(metadata %"struct.std::pair.1976"* %__result.addr.099, metadata !16, metadata !DIExpression()), !dbg !17 + br i1 undef, label %while.body.i.preheader, label %while.body, !dbg !17 + + while.body.i.preheader: ; preds = %while.body + br label %while.body.i, !dbg !17 + + while.body.i: ; preds = %while.body.i, %while.body.i.preheader + %__result.addr.046.i = phi %"struct.std::pair.1976"* [ %incdec.ptr7.i, %while.body.i ], [ %__result.addr.099, %while.body.i.preheader ] + %incdec.ptr7.i = getelementptr inbounds %"struct.std::pair.1976", %"struct.std::pair.1976"* %__result.addr.046.i, i64 1, !dbg !17 + %cmp.not.i = icmp ne %"struct.std::pair.1976"* undef, undef, !dbg !17 + %0 = and i1 undef, %cmp.not.i, !dbg !17 + br i1 %0, label %while.body.i, label %while.body, !dbg !17 + } + + ; Function Attrs: nounwind readnone speculatable willreturn + declare void @llvm.dbg.value(metadata, metadata, metadata) + + ; Function Attrs: nounwind + declare void @llvm.stackprotector(i8*, i8**) + + !llvm.dbg.cu = !{!0} + !llvm.module.flags = !{!7, !8, !9, !10} + !llvm.ident = !{!11} + !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 10.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, globals: !3, debugInfoForProfiling: true, nameTableKind: None) + !1 = !DIFile(filename: "main.cpp", directory: "F:\") + !2 = !{} + !3 = !{!4} + !4 = !DIGlobalVariableExpression(var: !5, expr: !DIExpression()) + !5 = distinct !DIGlobalVariable(name: "start", scope: !0, file: !1, line: 4, type: !6, isLocal: false, isDefinition: true) + !6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) + !7 = !{i32 2, !"Dwarf Version", i32 4} + !8 = !{i32 2, !"Debug Info Version", i32 3} + !9 = !{i32 1, !"wchar_size", i32 2} + !10 = !{i32 7, !"PIC Level", i32 2} + !11 = !{!"clang version 10.0.0"} + !12 = distinct !DISubprogram(name: "bb_to_bb", linkageName: "bb_to_bb", scope: !1, file: !1, line: 6, type: !13, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !15) + !13 = !DISubroutineType(types: !14) + !14 = !{!6, !6} + !15 = !{!16} + !16 = !DILocalVariable(name: "myVar", scope: !12, file: !1, line: 7, type: !6) + !17 = !DILocation(line: 10, scope: !12) + + +... +--- +name: _ZSt17__merge_sort_loopIPSt4pairIN5clang14SourceLocationEjES4_lN9__gnu_cxx5__ops15_Iter_comp_iterIN4llvm11less_secondEEEEvT_SB_T0_T1_T2_ +alignment: 16 +tracksRegLiveness: true +registers: [] +liveins: + - { reg: '$rdi', virtual-reg: '' } +machineFunctionInfo: {} +body: | + bb.0.while.body.lr.ph: + successors: %bb.1(0x80000000) + liveins: $rdi + + renamable $eax = XOR32rr undef $eax, undef $eax, implicit-def dead $eflags + + bb.1.while.body (align 16): + successors: %bb.2(0x40000000), %bb.1(0x40000000) + liveins: $eax, $rdi + + DBG_VALUE $rdi, $noreg, !16, !DIExpression(), debug-location !17 + TEST8rr renamable $al, renamable $al, implicit-def $eflags, debug-location !17 + JCC_1 %bb.1, 5, implicit killed $eflags, debug-location !17 + + bb.2.while.body.i (align 16): + successors: %bb.3(0x7e000000), %bb.1(0x02000000) + liveins: $eax, $rdi + + renamable $rdi = nuw ADD64ri8 killed renamable $rdi, 8, implicit-def dead $eflags, debug-location !17 + TEST8rr renamable $al, renamable $al, implicit-def $eflags, debug-location !17 + JCC_1 %bb.1, 5, implicit $eflags, debug-location !17 + + bb.3.while.body.i: + successors: %bb.2(0x7df7df7e), %bb.1(0x02082082) + liveins: $eax, $rdi + + TEST8rr renamable $al, renamable $al, implicit-def $eflags, debug-location !17 + JCC_1 %bb.2, 5, implicit $eflags + JMP_1 %bb.1 + +... diff --git a/llvm/test/DebugInfo/MIR/InstrRef/livedebugvalues_path_lengths.mir b/llvm/test/DebugInfo/MIR/InstrRef/livedebugvalues_path_lengths.mir new file mode 100644 --- /dev/null +++ b/llvm/test/DebugInfo/MIR/InstrRef/livedebugvalues_path_lengths.mir @@ -0,0 +1,273 @@ +--- | + ; RUN: llc %s -march=x86-64 -run-pass=livedebugvalues -o - | FileCheck %s + ; RUN: llc %s -march=x86-64 -run-pass=livedebugvalues -o - -experimental-debug-variable-locations | FileCheck %s + ; + ; This is a regression test extracted from llvm11ish LICM.cpp. Consider the + ; blocks from bb.6 to bb.9: there are two paths to bb.9, one an immediate + ; branch, the other takes a longer route. Because VarLocBased LiveDebugValues + ; always schedules blocks to be examined in the _next_ dataflow iteration, + ; any exploration starting at bb.6 follows this pattern: + ; * Round 1: Examine block 6 + ; * Round 2: Examine block 7 and 9 + ; * Round 3: Examine block 8 + ; * Round 4: Examine block 9 + ; This works for VarLocBased LDV as it has a simple lattice. However for + ; InstrRefBasedLDV, in the first examination of block 9 not all predecessors + ; will have yet accounted for any changes to block 6's live-outs. It takes + ; several iterations for those to reach block 8. This raises the possibility + ; of blocks seeing conflicting variable values on their live-in edges, which + ; wouldn't be present if their predecessors had been visited beforehand. + ; + ; It's also not really reverse-post-order visiting. + + ; Test that a variable value appears in bb.9, which is renumbered 19 during + ; mir parsing. + ; CHECK-LABEL: bb.19: + ; CHECK: DBG_VALUE + ; CHECK-NEXT: JMP_1 %bb.19 + + ; ModuleID = 'rpot_bad.ll' + source_filename = "/fast/fs/llvm3/llvm/lib/Transforms/Scalar/LICM.cpp" + target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" + target triple = "x86_64-unknown-linux-gnu" + + ; Function Attrs: nounwind uwtable + define zeroext i1 @mangled(i64 %LI, i64 %DT, i64 %MSSAU) local_unnamed_addr #0 !dbg !12 { + entry: + ret i1 0 + } + + declare zeroext i1 @_ZNK4llvm10BasicBlock20canSplitPredecessorsEv() local_unnamed_addr #1 + + declare i1 @_ZN4llvm22SplitBlockPredecessorsEPNS_10BasicBlockENS_8ArrayRefIS1_EEPKcPNS_13DominatorTreeEPNS_8LoopInfoEPNS_16MemorySSAUpdaterEb() local_unnamed_addr #1 + + ; Function Attrs: nounwind uwtable + declare hidden void @_ZN4llvm9SetVectorIPNS_10BasicBlockENS_11SmallVectorIS2_Lj8EEENS_13SmallDenseSetIS2_Lj8ENS_12DenseMapInfoIS2_EEEEE6insertINS_12PredIteratorIS1_NS_5Value18user_iterator_implINS_4UserEEEEEEEvT_SH_() local_unnamed_addr #0 align 2 + + ; Function Attrs: nounwind readnone speculatable willreturn + declare void @llvm.dbg.value(metadata, metadata, metadata) #2 + + ; Function Attrs: nounwind + declare void @llvm.stackprotector(i8*, i8**) #3 + + !llvm.dbg.cu = !{!0} + !llvm.module.flags = !{!7, !8, !9, !10} + !llvm.ident = !{!11} + !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 10.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, globals: !3, debugInfoForProfiling: true, nameTableKind: None) + !1 = !DIFile(filename: "main.cpp", directory: "F:\") + !2 = !{} + !3 = !{!4} + !4 = !DIGlobalVariableExpression(var: !5, expr: !DIExpression()) + !5 = distinct !DIGlobalVariable(name: "start", scope: !0, file: !1, line: 4, type: !6, isLocal: false, isDefinition: true) + !6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) + !7 = !{i32 2, !"Dwarf Version", i32 4} + !8 = !{i32 2, !"Debug Info Version", i32 3} + !9 = !{i32 1, !"wchar_size", i32 2} + !10 = !{i32 7, !"PIC Level", i32 2} + !11 = !{!"clang version 10.0.0"} + !12 = distinct !DISubprogram(name: "bb_to_bb", linkageName: "bb_to_bb", scope: !1, file: !1, line: 6, type: !13, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !15) + !13 = !DISubroutineType(types: !14) + !14 = !{!6, !6} + !15 = !{!16} + !16 = !DILocalVariable(name: "myVar", scope: !12, file: !1, line: 7, type: !6) + !17 = !DILocation(line: 10, scope: !12) + + +... +--- +name: mangled +alignment: 16 +tracksRegLiveness: true +liveins: + - { reg: '$rdi' } + - { reg: '$rsi' } + - { reg: '$rdx' } +frameInfo: + stackSize: 56 + offsetAdjustment: -56 + maxAlignment: 8 + adjustsStack: true + hasCalls: true + maxCallFrameSize: 16 + cvBytesOfCalleeSavedRegisters: 48 +fixedStack: + - { id: 0, type: spill-slot, offset: -56, size: 8, alignment: 8, callee-saved-register: '$rbx' } + - { id: 1, type: spill-slot, offset: -48, size: 8, alignment: 16, callee-saved-register: '$r12' } + - { id: 2, type: spill-slot, offset: -40, size: 8, alignment: 8, callee-saved-register: '$r13' } + - { id: 3, type: spill-slot, offset: -32, size: 8, alignment: 16, callee-saved-register: '$r14' } + - { id: 4, type: spill-slot, offset: -24, size: 8, alignment: 8, callee-saved-register: '$r15' } + - { id: 5, type: spill-slot, offset: -16, size: 8, alignment: 16, callee-saved-register: '$rbp' } +stack: + - { id: 0, type: spill-slot, offset: -64, size: 8, alignment: 8 } +machineFunctionInfo: {} +body: | + bb.0: + liveins: $rdi, $rdx, $rsi, $rbp, $r15, $r14, $r13, $r12, $rbx + + frame-setup PUSH64r killed $rbp, implicit-def $rsp, implicit $rsp + CFI_INSTRUCTION def_cfa_offset 16 + frame-setup PUSH64r killed $r15, implicit-def $rsp, implicit $rsp + CFI_INSTRUCTION def_cfa_offset 24 + frame-setup PUSH64r killed $r14, implicit-def $rsp, implicit $rsp + CFI_INSTRUCTION def_cfa_offset 32 + frame-setup PUSH64r killed $r13, implicit-def $rsp, implicit $rsp + CFI_INSTRUCTION def_cfa_offset 40 + frame-setup PUSH64r killed $r12, implicit-def $rsp, implicit $rsp + CFI_INSTRUCTION def_cfa_offset 48 + frame-setup PUSH64r killed $rbx, implicit-def $rsp, implicit $rsp + CFI_INSTRUCTION def_cfa_offset 56 + frame-setup PUSH64r undef $rax, implicit-def $rsp, implicit $rsp + CFI_INSTRUCTION def_cfa_offset 64 + CFI_INSTRUCTION offset $rbx, -56 + CFI_INSTRUCTION offset $r12, -48 + CFI_INSTRUCTION offset $r13, -40 + CFI_INSTRUCTION offset $r14, -32 + CFI_INSTRUCTION offset $r15, -24 + CFI_INSTRUCTION offset $rbp, -16 + $r14 = MOV64rr $rdx + $r15 = MOV64rr $rsi + $r12 = MOV64rr $rdi + renamable $r13d = XOR32rr undef $r13d, undef $r13d, implicit-def dead $eflags, implicit-def $r13 + renamable $bpl = MOV8ri 1 + + bb.1: + liveins: $bpl, $r12, $r13, $r14, $r15 + + renamable $rax = MOV64rm undef renamable $rax, 1, $noreg, 0, $noreg, debug-location !17 :: (load 8 from `i64* undef`) + renamable $rax = AND64ri8 killed renamable $rax, -8, implicit-def dead $eflags, debug-location !17 + renamable $rcx = LEA64r renamable $rax, 1, $noreg, -24, $noreg, debug-location !17 + TEST64rr renamable $rax, renamable $rax, implicit-def $eflags, debug-location !17 + renamable $rcx = CMOV64rr killed renamable $rcx, killed renamable $rax, 4, implicit killed $eflags, debug-location !17 + DBG_VALUE $rcx, $noreg, !16, !DIExpression(), debug-location !17 + MOV64mr $rsp, 1, $noreg, 0, $noreg, killed renamable $rcx :: (store 8 into %stack.0) + DBG_VALUE $rsp, 0, !16, !DIExpression(), debug-location !17 + TEST8rr renamable $r13b, renamable $r13b, implicit-def $eflags, debug-location !17 + JCC_1 %bb.1, 5, implicit killed $eflags, debug-location !17 + + bb.2: + liveins: $bpl, $r12, $r13, $r14, $r15 + + TEST8rr renamable $r13b, renamable $r13b, implicit-def $eflags, debug-location !17 + JCC_1 %bb.1, 5, implicit $eflags, debug-location !17 + + bb.3: + successors: %bb.4, %bb.1 + liveins: $bpl, $r12, $r13, $r14, $r15 + + TEST8rr renamable $r13b, renamable $r13b, implicit-def $eflags, debug-location !17 + JCC_1 %bb.1, 5, implicit $eflags, debug-location !17 + + bb.4: + successors: %bb.5(0x7c000000), %bb.6(0x04000000) + liveins: $bpl, $r12, $r13, $r14, $r15 + + TEST8rr renamable $r13b, renamable $r13b, implicit-def $eflags, debug-location !17 + JCC_1 %bb.6, 5, implicit $eflags, debug-location !17 + + bb.5: + successors: %bb.6(0x04000000), %bb.10(0x7c000000) + liveins: $bpl, $r12, $r13, $r14, $r15 + + CALL64r undef renamable $rax, csr_64, implicit $rsp, implicit $ssp, implicit undef $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def $al, debug-location !17 + TEST8rr killed renamable $al, renamable $al, implicit-def $eflags, debug-location !17 + JCC_1 %bb.6, 5, implicit $eflags, debug-location !17 + + bb.10: + liveins: $bpl, $r12, $r13, $r14, $r15 + + renamable $rax = IMPLICIT_DEF + JMP_1 %bb.11 + + bb.19: + liveins: $bpl, $r12, $r13, $r14, $r15 + + renamable $rax = MOV64rm $rsp, 1, $noreg, 0, $noreg :: (load 8 from %stack.0) + renamable $rax = MOV64rm killed renamable $rax, 1, $noreg, 8, $noreg, debug-location !17 :: (load 8 from `i64 *undef`) + + bb.11: + successors: %bb.12, %bb.11 + liveins: $bpl, $rax, $r12, $r13, $r14, $r15 + + TEST8rr renamable $r13b, renamable $r13b, implicit-def $eflags, debug-location !17 + JCC_1 %bb.11, 5, implicit killed $eflags, debug-location !17 + + bb.12: + successors: %bb.13, %bb.11 + liveins: $bpl, $rax, $r12, $r13, $r14, $r15 + + TEST8rr renamable $r13b, renamable $r13b, implicit-def $eflags, debug-location !17 + JCC_1 %bb.11, 5, implicit $eflags, debug-location !17 + + bb.13: + liveins: $bpl, $rax, $r12, $r13, $r14, $r15 + + TEST8rr renamable $r13b, renamable $r13b, implicit-def $eflags, debug-location !17 + JCC_1 %bb.11, 5, implicit $eflags, debug-location !17 + + bb.14: + successors: %bb.15(0x7c000000), %bb.1(0x04000000) + liveins: $bpl, $rax, $r12, $r13, $r14, $r15 + + renamable $rbx = MOV64rm killed renamable $rax, 1, $noreg, 24, $noreg :: (load 8 from `i64 *undef`) + CALL64pcrel32 @_ZNK4llvm10BasicBlock20canSplitPredecessorsEv, csr_64, implicit $rsp, implicit $ssp, implicit undef $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def $al, debug-location !17 + TEST8rr killed renamable $al, renamable $al, implicit-def $eflags, debug-location !17 + JCC_1 %bb.1, 4, implicit $eflags, debug-location !17 + + bb.15: + liveins: $bpl, $rbx, $r12, $r13, $r14, $r15 + + renamable $rbx = MOV64rm killed renamable $rbx, 1, $noreg, 40, $noreg, debug-location !17 :: (load 8 from `i64 *undef`) + dead $edx = XOR32rr undef $edx, undef $edx, implicit-def dead $eflags, implicit-def $rdx, debug-location !17 + CALL64pcrel32 @_ZN4llvm9SetVectorIPNS_10BasicBlockENS_11SmallVectorIS2_Lj8EEENS_13SmallDenseSetIS2_Lj8ENS_12DenseMapInfoIS2_EEEEE6insertINS_12PredIteratorIS1_NS_5Value18user_iterator_implINS_4UserEEEEEEEvT_SH_, csr_64, implicit $rsp, implicit $ssp, implicit undef $rdi, implicit undef $rsi, implicit $rdx, implicit-def $rsp, implicit-def $ssp, debug-location !17 + + bb.16: + successors: %bb.19(0x061801fc), %bb.17(0x79e7fe04) + liveins: $bpl, $r12, $r13, $r14, $r15, $rbx + + CMP32mi8 undef renamable $rax, 1, $noreg, 0, $noreg, 0, implicit-def $eflags, debug-location !17 :: (load 4 from `i32* undef`, align 8) + JCC_1 %bb.19, 4, implicit $eflags, debug-location !17 + + bb.17: + successors: %bb.16(0x30000000), %bb.18(0x50000000) + liveins: $bpl, $rbx, $r12, $r13, $r14, $r15 + + TEST8rr renamable $bpl, renamable $bpl, implicit-def $eflags, debug-location !17 + JCC_1 %bb.16, 5, implicit $eflags, debug-location !17 + + bb.18: + liveins: $bpl, $rbx, $r12, $r13, $r14, $r15 + + $edx = MOV32ri 1, implicit-def $rdx, debug-location !17 + ;$ecx = MOV32ri @.str.282, implicit-def $rcx, debug-location !17 + $ecx = MOV32ri 1, debug-location !17 + $rdi = MOV64rr $rbx, debug-location !17 + $r8 = MOV64rr $r15, debug-location !17 + $r9 = MOV64rr $r12, debug-location !17 + PUSH64i8 1, implicit-def $rsp, implicit $rsp, debug-location !17 :: (store 4 into stack + 8) + CFI_INSTRUCTION adjust_cfa_offset 8, debug-location !17 + PUSH64r renamable $r14, implicit-def $rsp, implicit $rsp, debug-location !17 :: (store 8 into stack) + CFI_INSTRUCTION adjust_cfa_offset 8, debug-location !17 + CALL64pcrel32 @_ZN4llvm22SplitBlockPredecessorsEPNS_10BasicBlockENS_8ArrayRefIS1_EEPKcPNS_13DominatorTreeEPNS_8LoopInfoEPNS_16MemorySSAUpdaterEb, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit undef $rsi, implicit $rdx, implicit $rcx, implicit $r8, implicit $r9, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax, debug-location !17 + $rsp = ADD64ri8 $rsp, 16, implicit-def dead $eflags, debug-location !17 + CFI_INSTRUCTION adjust_cfa_offset -16, debug-location !17 + JMP_1 %bb.16 + + bb.6: + renamable $eax = XOR32rr undef $eax, undef $eax, implicit-def dead $eflags + TEST8rr renamable $al, renamable $al, implicit-def $eflags, implicit killed $eax, debug-location !17 + JCC_1 %bb.9, 5, implicit $eflags, debug-location !17 + + bb.7: + renamable $eax = XOR32rr undef $eax, undef $eax, implicit-def dead $eflags + + bb.8: + successors: %bb.9(0x04000000), %bb.8(0x7c000000) + liveins: $eax + + TEST8rr renamable $al, renamable $al, implicit-def $eflags, debug-location !17 + JCC_1 %bb.8, 5, implicit killed $eflags, debug-location !17 + + bb.9: + JMP_1 %bb.9 + +... diff --git a/llvm/test/DebugInfo/MIR/Mips/last-inst-bundled.mir b/llvm/test/DebugInfo/MIR/Mips/last-inst-bundled.mir --- a/llvm/test/DebugInfo/MIR/Mips/last-inst-bundled.mir +++ b/llvm/test/DebugInfo/MIR/Mips/last-inst-bundled.mir @@ -21,7 +21,7 @@ # # Check that last bundled instruction of block gets recognized as end of basic block. # CHECK: bb.2.if.end -# CHECK-NEXT: DBG_VALUE $s0, $noreg, !12, !DIExpression(), debug-location !17 +# CHECK-NEXT: DBG_VALUE $s0, $noreg, !12, !DIExpression() --- | ; ModuleID = '' diff --git a/llvm/test/DebugInfo/MIR/X86/kill-after-spill.mir b/llvm/test/DebugInfo/MIR/X86/kill-after-spill.mir --- a/llvm/test/DebugInfo/MIR/X86/kill-after-spill.mir +++ b/llvm/test/DebugInfo/MIR/X86/kill-after-spill.mir @@ -14,8 +14,8 @@ # ... # # CHECK: bb.1.if.end: -# CHECK: DBG_VALUE $rbp, 0, !37, !DIExpression(DW_OP_constu, 44, DW_OP_minus), debug-location !58 -# CHECK-NOT: DBG_VALUE $rbp, 0, !36, !DIExpression(DW_OP_constu, 48, DW_OP_minus), debug-location !57 +# CHECK: DBG_VALUE $rbp, 0, !37, !DIExpression(DW_OP_constu, 44, DW_OP_minus) +# CHECK-NOT: DBG_VALUE $rbp, 0, !36, !DIExpression(DW_OP_constu, 48, DW_OP_minus) --- | ; ModuleID = '' @@ -283,7 +283,7 @@ $r13 = MOV64rr $rax renamable $ecx = XOR32rr undef $ecx, undef $ecx, implicit-def dead $eflags renamable $r13 = AND64rr killed renamable $r13, renamable $r14, implicit-def $eflags - JCC_1 %bb.9, 4, implicit $eflags + JCC_1 %bb.9, 4, implicit $eflags, debug-location !57 bb.1.if.end: successors: %bb.2(0x30000000), %bb.3(0x50000000) @@ -301,7 +301,7 @@ $r12 = MOV64rr $rax $r15 = MOV64rr $r12 renamable $r15 = AND64ri8 killed renamable $r15, -123, implicit-def $eflags - JCC_1 %bb.2, 4, implicit $eflags + JCC_1 %bb.2, 4, implicit $eflags, debug-location !57 bb.3.private.exit: successors: %bb.9(0x30000000), %bb.4(0x50000000) @@ -316,7 +316,7 @@ CALL64pcrel32 @func4, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def $eax renamable $ecx = MOV32ri 1 TEST32rr killed renamable $eax, renamable $eax, implicit-def $eflags - JCC_1 %bb.9, 4, implicit $eflags + JCC_1 %bb.9, 4, implicit $eflags, debug-location !57 bb.4.if.then8: successors: %bb.8(0x30000000), %bb.5(0x50000000) @@ -327,21 +327,21 @@ CALL64pcrel32 @func5, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit $esi, implicit-def $rsp, implicit-def $ssp renamable $rax = MOV64rm killed renamable $r13, 1, $noreg, 8, $noreg :: (load 8 from %ir.13) TEST64rr renamable $rax, renamable $rax, implicit-def $eflags - JCC_1 %bb.8, 4, implicit $eflags + JCC_1 %bb.8, 4, implicit $eflags, debug-location !57 bb.5.land.lhs.true: successors: %bb.6(0x30000000), %bb.7(0x50000000) liveins: $rax, $r12, $r15 CMP32mi8 renamable $r15, 1, $noreg, 0, $noreg, 0, implicit-def $eflags :: (load 4 from %ir.tot_perf2, align 8) - JCC_1 %bb.7, 5, implicit $eflags + JCC_1 %bb.7, 5, implicit $eflags, debug-location !57 bb.6.lor.lhs.false: successors: %bb.8(0x30000000), %bb.7(0x50000000) liveins: $rax, $r12, $r15 CMP32mi8 killed renamable $r15, 1, $noreg, 4, $noreg, 0, implicit-def $eflags :: (load 4 from %ir.tot_bw) - JCC_1 %bb.8, 4, implicit $eflags + JCC_1 %bb.8, 4, implicit $eflags, debug-location !57 bb.7.if.then14: successors: %bb.8(0x80000000) @@ -350,13 +350,13 @@ renamable $rdx = MOV64rm killed renamable $rax, 1, $noreg, 8, $noreg :: (load 8 from %ir.20) $rdi = MOV64rr killed $r12 $esi = MOV32rm $rbp, 1, $noreg, -44, $noreg :: (load 4 from %stack.1) - CALL64pcrel32 @func6, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit $esi, implicit $rdx, implicit-def $rsp, implicit-def $ssp + CALL64pcrel32 @func6, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit $esi, implicit $rdx, implicit-def $rsp, implicit-def $ssp, debug-location !57 bb.8.cleanup: successors: %bb.9(0x80000000) renamable $ecx = MOV32ri 1 - JMP_1 %bb.9 + JMP_1 %bb.9, debug-location !57 bb.2.if.then3: successors: %bb.9(0x80000000) @@ -369,7 +369,7 @@ $edx = MOV32ri 5 $r8d = MOV32rm $rbp, 1, $noreg, -48, $noreg :: (load 4 from %stack.0) CALL64pcrel32 @func3, csr_64, implicit $rsp, implicit $ssp, implicit $edi, implicit $esi, implicit $edx, implicit $rcx, implicit $r8d, implicit-def $rsp, implicit-def $ssp - renamable $ecx = XOR32rr undef $ecx, undef $ecx, implicit-def dead $eflags + renamable $ecx = XOR32rr undef $ecx, undef $ecx, implicit-def dead $eflags, debug-location !57 bb.9.cleanup: liveins: $ecx @@ -382,6 +382,6 @@ $r14 = POP64r implicit-def $rsp, implicit $rsp $r15 = POP64r implicit-def $rsp, implicit $rsp $rbp = POP64r implicit-def $rsp, implicit $rsp - RETQ $eax + RETQ $eax, debug-location !57 ... diff --git a/llvm/test/DebugInfo/MIR/X86/live-debug-values-3preds.mir b/llvm/test/DebugInfo/MIR/X86/live-debug-values-3preds.mir --- a/llvm/test/DebugInfo/MIR/X86/live-debug-values-3preds.mir +++ b/llvm/test/DebugInfo/MIR/X86/live-debug-values-3preds.mir @@ -31,9 +31,9 @@ # DBG_VALUE for variables "x", "y" and "z" are extended into %bb.9 from its # predecessors %bb.0, %bb.2 and %bb.8. # CHECK: bb.9.for.end: -# CHECK-DAG: DBG_VALUE $edi, $noreg, ![[X_VAR]], !DIExpression(), debug-location !{{[0-9]+}} -# CHECK-DAG: DBG_VALUE $esi, $noreg, ![[Y_VAR]], !DIExpression(), debug-location !{{[0-9]+}} -# CHECK-DAG: DBG_VALUE $edx, $noreg, ![[Z_VAR]], !DIExpression(), debug-location !{{[0-9]+}} +# CHECK-DAG: DBG_VALUE $edi, $noreg, ![[X_VAR]], !DIExpression() +# CHECK-DAG: DBG_VALUE $esi, $noreg, ![[Y_VAR]], !DIExpression() +# CHECK-DAG: DBG_VALUE $edx, $noreg, ![[Z_VAR]], !DIExpression() # CHECK: RET --- | diff --git a/llvm/test/DebugInfo/MIR/X86/live-debug-values-bad-transfer.mir b/llvm/test/DebugInfo/MIR/X86/live-debug-values-bad-transfer.mir --- a/llvm/test/DebugInfo/MIR/X86/live-debug-values-bad-transfer.mir +++ b/llvm/test/DebugInfo/MIR/X86/live-debug-values-bad-transfer.mir @@ -1,4 +1,5 @@ # RUN: llc %s -mtriple=x86_64-unknown-unknown -o - -run-pass=livedebugvalues | FileCheck %s --implicit-check-not=DBG_VALUE +# RUN: llc %s -mtriple=x86_64-unknown-unknown -o - -run-pass=livedebugvalues -experimental-debug-variable-locations | FileCheck %s -check-prefix=NEWLDV --implicit-check-not=DBG_VALUE # # Test that the DBG_VALUE of ecx below does not get propagated. It is considered # live-in on LiveDebugValues' first pass through the loop, but on the second it @@ -17,6 +18,13 @@ # CHECK-LABEL: bb.1.loop: # CHECK: $ebx = COPY killed $ecx # CHECK-NEXT: DBG_VALUE +# +# This doesn't occur under value-tracking LiveDebugValues though. +# +# NEWLDV-LABEL: name: foo +# NEWLDV-LABEL: bb.0.entry: +# NEWLDV: $ecx = MOV32ri 0 +# NEWLDV-NEXT: DBG_VALUE --- | source_filename = "live-debug-values-remove-range.ll" @@ -74,30 +82,30 @@ CFI_INSTRUCTION def_cfa_offset 16 CFI_INSTRUCTION offset $rbx, -16 $ebx = MOV32rr $edi - $eax = MOV32ri 0 - $ecx = MOV32ri 0 + $eax = MOV32ri 0, debug-location !10 + $ecx = MOV32ri 0, debug-location !10 DBG_VALUE $ecx, $noreg, !9, !DIExpression(), debug-location !10 - $edi = MOV32ri 0 - $esi = MOV32ri 0 + $edi = MOV32ri 0, debug-location !10 + $esi = MOV32ri 0, debug-location !10 bb.1.loop: successors: %bb.1, %bb.2 liveins: $ebx, $eax, $ecx, $edi, $esi - $eax = COPY $ecx - $ebx = COPY killed $ecx - $ecx = COPY killed $edi - $edi = COPY killed $esi - $esi = MOV32ri 1 + $eax = COPY $ecx, debug-location !10 + $ebx = COPY killed $ecx, debug-location !10 + $ecx = COPY killed $edi, debug-location !10 + $edi = COPY killed $esi, debug-location !10 + $esi = MOV32ri 1, debug-location !10 TEST8ri killed renamable $al, 1, implicit-def $eflags - JCC_1 %bb.1, 5, implicit killed $eflags + JCC_1 %bb.1, 5, implicit killed $eflags, debug-location !10 bb.2.exit: liveins: $ebx - $eax = MOV32rr killed $ebx + $eax = MOV32rr killed $ebx, debug-location !10 $rbx = frame-destroy POP64r implicit-def $rsp, implicit $rsp CFI_INSTRUCTION def_cfa_offset 8 - RETQ $eax + RETQ $eax, debug-location !10 ... diff --git a/llvm/test/DebugInfo/MIR/X86/live-debug-values.mir b/llvm/test/DebugInfo/MIR/X86/live-debug-values.mir --- a/llvm/test/DebugInfo/MIR/X86/live-debug-values.mir +++ b/llvm/test/DebugInfo/MIR/X86/live-debug-values.mir @@ -35,7 +35,7 @@ # CHECK: ![[N_VAR:[0-9]+]] = !DILocalVariable(name: "n",{{.*}}) # # CHECK: bb.5.if.end.7: -# CHECK: DBG_VALUE $ebx, $noreg, ![[N_VAR]], !DIExpression(), debug-location !{{[0-9]+}} +# CHECK: DBG_VALUE $ebx, $noreg, ![[N_VAR]], !DIExpression() --- | diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues-ignores-metaInstructions.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues-ignores-metaInstructions.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues-ignores-metaInstructions.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues-ignores-metaInstructions.mir @@ -6,11 +6,11 @@ ; CHECK-LABEL: bb.0.entry: ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 ; CHECK-LABEL: bb.1.bb1: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.2.bb2: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.3.bb3: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { entry: diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond.mir @@ -5,13 +5,13 @@ ; a diamond that doesn't move or clobber their locations. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.1.bb1: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.2.bb2: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.3.bb3: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { entry: diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond_match_clobber.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond_match_clobber.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond_match_clobber.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond_match_clobber.mir @@ -5,12 +5,12 @@ ; a diamond when the location is clobbered and not into the successor block. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.1.bb1: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-NEXT: $ebx = MOV32ri 0, debug-location !17 ; CHECK-LABEL: bb.2.bb2: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-NEXT: $ebx = MOV32ri 0, debug-location !17 define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond_match_move.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond_match_move.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond_match_move.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond_match_move.mir @@ -5,17 +5,17 @@ ; diamond CFG when the location is moved by another instruction. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.1.bb1: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-NEXT: $eax = MOV32ri 0, debug-location !17 - ; CHECK-NEXT: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK-NEXT: DBG_VALUE $eax, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.2.bb2: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-NEXT: $eax = MOV32ri 0, debug-location !17 - ; CHECK-NEXT: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK-NEXT: DBG_VALUE $eax, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.3.bb3: - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression() define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { entry: diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond_one_clobber.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond_one_clobber.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond_one_clobber.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond_one_clobber.mir @@ -5,11 +5,11 @@ ; of a diamond CFG that clobbers its location. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.1.bb1: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.2.bb2: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { entry: diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond_one_move.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond_one_move.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond_one_move.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_diamond_one_move.mir @@ -5,13 +5,13 @@ ; of a diamond CFG that moves its location. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.1.bb1: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-NEXT: $eax = MOV32ri 0, debug-location !17 - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.2.bb2: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { entry: diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_loop.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_loop.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_loop.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_basic_loop.mir @@ -5,13 +5,13 @@ ; loop that doesn't move or clobber its location. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.1.bb1: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.2.bb2: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.3.bb3: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { entry: diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_bb_to_bb.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_bb_to_bb.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_bb_to_bb.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_bb_to_bb.mir @@ -5,13 +5,13 @@ ; sequential CFG. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.1.bb1: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.2.bb2: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.3.bb3: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { entry: diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_bb_to_bb_clobbered.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_bb_to_bb_clobbered.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_bb_to_bb_clobbered.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_bb_to_bb_clobbered.mir @@ -5,9 +5,9 @@ ; control flow when it's location is clobbered. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.1.bb1: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { entry: diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_bb_to_bb_move_to_clobber.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_bb_to_bb_move_to_clobber.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_bb_to_bb_move_to_clobber.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_bb_to_bb_move_to_clobber.mir @@ -5,13 +5,13 @@ ; no control flow when a location is moved and then clobbered. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.1.bb1: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-NEXT: $eax = MOV32ri 0, debug-location !17 - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.2.bb2: - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.3.bb3: define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_load_in_loop.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_load_in_loop.mir new file mode 100644 --- /dev/null +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_load_in_loop.mir @@ -0,0 +1,113 @@ +--- | + ; RUN: llc %s -march=x86-64 -run-pass=livedebugvalues -o - -experimental-debug-variable-locations -emulate-old-livedebugvalues=0 | FileCheck %s -implicit-check-not=DBG_VALUE + + ; Sometimes, variables can have multiple locations, and when control flow + ; merges LiveDebugValues has a hard time picking which one the variable lives + ; in. Test two of these scenarios that old LiveDebugValues can't handle: when + ; a value is in two registers, and when a value is both in a register and + ; on the stack. + + ; In a register: + + ; CHECK-LABEL: bb.0.entry: + ; CHECK: DBG_VALUE $rdi, $noreg, !16, !DIExpression() + ; CHECK-LABEL: bb.1.bb1: + ; CHECK: DBG_VALUE $rbp, $noreg, !16, !DIExpression() + ; CHECK: DBG_VALUE $rbp, $noreg, !16, !DIExpression() + ; CHECK-LABEL: bb.2.bb2: + ; CHECK: DBG_VALUE $rbp, $noreg, !16, !DIExpression() + ; CHECK-LABEL: bb.3.bb3: + ; CHECK: DBG_VALUE $rbp, $noreg, !16, !DIExpression() + + ; On the stack: we move from $rbp to a stack slot in bb4, but join back on + ; $rbp in bb6. + + ; CHECK-LABEL: bb.4: + ; CHECK: DBG_VALUE $rbp, $noreg, !16, !DIExpression() + ; CHECK: DBG_VALUE $rsp, 0, !16, !DIExpression() + ; CHECK-LABEL: bb.5: + ; CHECK: DBG_VALUE $rbp, $noreg, !16, !DIExpression() + ; CHECK-LABEL: bb.6: + ; CHECK: DBG_VALUE $rbp, $noreg, !16, !DIExpression() + + declare i64 @bees(i64 %arg); + + define i32 @_Z8bb_to_bb(i64 %arg) local_unnamed_addr !dbg !12 { + entry: + br label %bb1, !dbg !17 + bb1: + br label %bb2, !dbg !17 + bb2: + br label %bb3, !dbg !17 + bb3: + ret i32 0, !dbg !17 + } + + !llvm.dbg.cu = !{!0} + !llvm.module.flags = !{!7, !8, !9, !10} + !llvm.ident = !{!11} + !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 10.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, globals: !3, debugInfoForProfiling: true, nameTableKind: None) + !1 = !DIFile(filename: "main.cpp", directory: "F:\") + !2 = !{} + !3 = !{!4} + !4 = !DIGlobalVariableExpression(var: !5, expr: !DIExpression()) + !5 = distinct !DIGlobalVariable(name: "start", scope: !0, file: !1, line: 4, type: !6, isLocal: false, isDefinition: true) + !6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) + !7 = !{i32 2, !"Dwarf Version", i32 4} + !8 = !{i32 2, !"Debug Info Version", i32 3} + !9 = !{i32 1, !"wchar_size", i32 2} + !10 = !{i32 7, !"PIC Level", i32 2} + !11 = !{!"clang version 10.0.0"} + !12 = distinct !DISubprogram(name: "bb_to_bb", linkageName: "bb_to_bb", scope: !1, file: !1, line: 6, type: !13, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !15) + !13 = !DISubroutineType(types: !14) + !14 = !{!6, !6} + !15 = !{!16} + !16 = !DILocalVariable(name: "myVar", scope: !12, file: !1, line: 7, type: !6) + !17 = !DILocation(line: 10, scope: !12) + +... +--- +name: _Z8bb_to_bb +tracksRegLiveness: true +liveins: + - { reg: '$rdi', virtual-reg: '' } +stack: + - { id: 0, name: '', type: spill-slot, offset: -8, size: 8, alignment: 8, + stack-id: default, callee-saved-register: '', callee-saved-restored: true, + debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } +body: | + bb.0.entry: + liveins: $rdi + successors: %bb.1, %bb.2 + DBG_VALUE $rdi, $noreg, !16, !DIExpression(), debug-location !17 + $rbp = MOV64rr $rdi, debug-location !17 + dead $rcx = MOV64ri 0, debug-location !17 + CALL64pcrel32 @bees, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def $rax, debug-location !17 + CMP64ri8 renamable $rax, 1, implicit-def $eflags, debug-location !17 + JCC_1 %bb.2, 4, implicit killed $eflags, debug-location !17 + bb.1.bb1: + liveins: $rax, $rbp + successors: %bb.3 + $rbp = MOV64ri 0, debug-location !17 + DBG_VALUE $rbp, $noreg, !16, !DIExpression(), debug-location !17 + JMP_1 %bb.3 + bb.2.bb2: + liveins: $rax, $rbp + successors: %bb.3 + $rax = MOV64ri 0, debug-location !17 + bb.3.bb3: + liveins: $rax, $rbp + $rdi = MOV64rr $rbp, debug-location !17 + CALL64pcrel32 @bees, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def $rax, debug-location !17 + CMP64ri8 renamable $rax, 1, implicit-def $eflags, debug-location !17 + JCC_1 %bb.5, 4, implicit killed $eflags, debug-location !17 + bb.4: + liveins: $rax, $rbp + MOV64mr $rsp, 1, $noreg, 8, $noreg, killed renamable $rbp :: (store 8 into %stack.0) + JMP_1 %bb.6 + bb.5: + liveins: $rax, $rbp + bb.6: + liveins: $rax, $rbp + RETQ $rax, debug-location !17 +... diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_break.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_break.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_break.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_break.mir @@ -5,15 +5,15 @@ ; break. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.1.bb1: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.2.bb2: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.3.bb3: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.4.bb4: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { entry: diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_diamond.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_diamond.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_diamond.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_diamond.mir @@ -5,17 +5,17 @@ ; diamond pattern and beyond. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.1.bb1: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.2.bb2: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.3.bb3: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.4.bb4: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.5.bb5: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { entry: diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_diamond_move.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_diamond_move.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_diamond_move.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_diamond_move.mir @@ -5,17 +5,17 @@ ; diamond pattern but not beyond. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.1.bb1: - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.2.bb2: - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.3.bb3: - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.4.bb4: - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.5.bb5: - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression() define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { entry: diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_two_backedge.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_two_backedge.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_two_backedge.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_two_backedge.mir @@ -5,15 +5,15 @@ ; backedges and beyond. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.1.bb1: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.2.bb2: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.3.bb3: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.4.bb4: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { entry: diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_within_loop.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_within_loop.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_within_loop.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_within_loop.mir @@ -4,17 +4,17 @@ ; Check that DBG_VALUE instructions are propagated into loops within loops. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.1.bb1: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.2.bb2: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.3.bb3: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.4.bb4: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.5.bb5: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { entry: diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_within_loop_moved.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_within_loop_moved.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_within_loop_moved.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_within_loop_moved.mir @@ -5,9 +5,9 @@ ; loops that move their locations. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.3.bb3: - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression() define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { entry: diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_within_loop_outer_moved.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_within_loop_outer_moved.mir --- a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_within_loop_outer_moved.mir +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_loop_within_loop_outer_moved.mir @@ -5,11 +5,11 @@ ; loops that move their locations. ; CHECK-LABEL: bb.0.entry: - ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.4.bb4: - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression() ; CHECK-LABEL: bb.5.bb5: - ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17 + ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression() define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 { entry: diff --git a/llvm/test/DebugInfo/MIR/X86/livedebugvalues_many_loop_heads.mir b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_many_loop_heads.mir new file mode 100644 --- /dev/null +++ b/llvm/test/DebugInfo/MIR/X86/livedebugvalues_many_loop_heads.mir @@ -0,0 +1,196 @@ +--- | + ; RUN: llc %s -march=x86-64 -run-pass=livedebugvalues -o - -experimental-debug-variable-locations | FileCheck %s -implicit-check-not=DBG_VALUE + + ; The MIR below represents a pathalogical case for value-tracking + ; LiveDebugValues. The code structure is eight nested loops, with loop heads + ; from bb.1 to bb.8, a central block bb.9 that does nothing, and loop ends + ; from bb.10 to bb.17. The CMP's and jumps might be broken; the only + ; important part is that it looks like nested loops to LiveDebugValues. + ; + ; The variable location is always $rsi, which enters the function live. + ; There's also a def of $rsi in bb.14, in a loop tail, half way into the + ; loop nest.s. + ; + ; This presents a serious problem: the outer four loops each implicitly have + ; a PHI value for $rsi, because the block could be entered on a path straight + ; from entry, or from bb.14 where $rsi is def'd. While the innermost four + ; loops have a value of $rsi that is live-through each loop from bb.5 + ; onwards. + ; + ; Value-tracking LiveDebugValues _must_ correctly identify each PHI value. + ; Observe the DBG_VALUE in bb.2: this variable location musn't be propagated + ; any further, because there's a path to either successor that goes through + ; bb.14 where the value is overwritten.Value tracking needs to identify the + ; PHI value on entry to the block; and that each successor has a different + ; PHI value in that register. + ; + ; Likewise, we mustn't identify values as PHIs which aren't. Entering bb.5 + ; has a PHI value (from bb.4) in $rsi. There are no paths to bb.5 that pass + ; through the clobbering bb.14, which don't also pass through bb.4: thus + ; that value is live-through the innermost four loops. If we + ; over-approximated where PHIs happened, we would lose variable location + ; coverage here, by not propagating the variable location through the inner + ; loops. + ; + ; Getting this right requires the lattice descent (described in the + ; implementation) to search loop head PHI values, until one is found that is + ; live-through a loop. + + ; This location in bb.2 should not be propagated further, + ; CHECK-LABEL: bb.2: + ; CHECK: DBG_VALUE $rsi, $noreg + + ; This location should be live through the inner loops, til bb.14 + ; CHECK-LABEL: bb.5: + ; CHECK: DBG_VALUE $rsi, $noreg + ; CHECK-LABEL: bb.6: + ; CHECK: DBG_VALUE $rsi, $noreg + ; CHECK-LABEL: bb.7: + ; CHECK: DBG_VALUE $rsi, $noreg + ; CHECK-LABEL: bb.8: + ; CHECK: DBG_VALUE $rsi, $noreg + ; CHECK-LABEL: bb.9: + ; CHECK: DBG_VALUE $rsi, $noreg + ; CHECK-LABEL: bb.10: + ; CHECK: DBG_VALUE $rsi, $noreg + ; CHECK-LABEL: bb.11: + ; CHECK: DBG_VALUE $rsi, $noreg + ; CHECK-LABEL: bb.12: + ; CHECK: DBG_VALUE $rsi, $noreg + ; CHECK-LABEL: bb.13: + ; CHECK: DBG_VALUE $rsi, $noreg + + declare i64 @bees(i64 %arg); + + define i32 @chiasm(i64 %arg) local_unnamed_addr !dbg !12 { + entry: + br label %bb1, !dbg !17 + bb1: + br label %bb2, !dbg !17 + bb2: + br label %bb3, !dbg !17 + bb3: + ret i32 0, !dbg !17 + } + + !llvm.dbg.cu = !{!0} + !llvm.module.flags = !{!7, !8, !9, !10} + !llvm.ident = !{!11} + !0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1, producer: "clang version 10.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, globals: !3, debugInfoForProfiling: true, nameTableKind: None) + !1 = !DIFile(filename: "main.cpp", directory: "F:\") + !2 = !{} + !3 = !{!4} + !4 = !DIGlobalVariableExpression(var: !5, expr: !DIExpression()) + !5 = distinct !DIGlobalVariable(name: "start", scope: !0, file: !1, line: 4, type: !6, isLocal: false, isDefinition: true) + !6 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) + !7 = !{i32 2, !"Dwarf Version", i32 4} + !8 = !{i32 2, !"Debug Info Version", i32 3} + !9 = !{i32 1, !"wchar_size", i32 2} + !10 = !{i32 7, !"PIC Level", i32 2} + !11 = !{!"clang version 10.0.0"} + !12 = distinct !DISubprogram(name: "bb_to_bb", linkageName: "bb_to_bb", scope: !1, file: !1, line: 6, type: !13, scopeLine: 6, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !15) + !13 = !DISubroutineType(types: !14) + !14 = !{!6, !6} + !15 = !{!16} + !16 = !DILocalVariable(name: "myVar", scope: !12, file: !1, line: 7, type: !6) + !17 = !DILocation(line: 10, scope: !12) + +... +--- +name: chiasm +tracksRegLiveness: true +liveins: + - { reg: '$rdi', virtual-reg: '' } +stack: + - { id: 0, name: '', type: spill-slot, offset: -8, size: 8, alignment: 8, + stack-id: default, callee-saved-register: '', callee-saved-restored: true, + debug-info-variable: '', debug-info-expression: '', debug-info-location: '' } +body: | + bb.0.entry: + liveins: $rdi, $rsi + + bb.1: + liveins: $rsi, $rdi + CMP64ri8 renamable $rdi, 1, implicit-def $eflags, debug-location !17 + JCC_1 %bb.17, 4, implicit $eflags, debug-location !17 + + bb.2: + liveins: $rsi, $rdi + DBG_VALUE $rsi, $noreg, !16, !DIExpression(), debug-location !17 + CMP64ri8 renamable $rdi, 2, implicit-def $eflags, debug-location !17 + JCC_1 %bb.16, 4, implicit $eflags, debug-location !17 + + bb.3: + liveins: $rsi, $rdi + CMP64ri8 renamable $rdi, 3, implicit-def $eflags, debug-location !17 + JCC_1 %bb.15, 4, implicit $eflags, debug-location !17 + + bb.4: + liveins: $rsi, $rdi + CMP64ri8 renamable $rdi, 4, implicit-def $eflags, debug-location !17 + JCC_1 %bb.14, 4, implicit $eflags, debug-location !17 + + bb.5: + liveins: $rsi, $rdi + DBG_VALUE $rsi, $noreg, !16, !DIExpression(), debug-location !17 + CMP64ri8 renamable $rdi, 4, implicit-def $eflags, debug-location !17 + JCC_1 %bb.13, 4, implicit $eflags, debug-location !17 + + bb.6: + liveins: $rsi, $rdi + CMP64ri8 renamable $rdi, 4, implicit-def $eflags, debug-location !17 + JCC_1 %bb.12, 4, implicit $eflags, debug-location !17 + + bb.7: + liveins: $rsi, $rdi + CMP64ri8 renamable $rdi, 4, implicit-def $eflags, debug-location !17 + JCC_1 %bb.11, 4, implicit $eflags, debug-location !17 + + bb.8: + liveins: $rsi, $rdi + CMP64ri8 renamable $rdi, 4, implicit-def $eflags, debug-location !17 + JCC_1 %bb.10, 4, implicit $eflags, debug-location !17 + + bb.9: + liveins: $rsi, $rdi, $eflags + ;$rsi = MOV64ri 0, debug-location !17 + ;JMP_1 %bb.1, debug-location !17 + + bb.10: + liveins: $rsi, $rdi, $eflags + JCC_1 %bb.8, 4, implicit $eflags, debug-location !17 + + bb.11: + liveins: $rsi, $rdi, $eflags + JCC_1 %bb.7, 4, implicit $eflags, debug-location !17 + + bb.12: + liveins: $rsi, $rdi, $eflags + JCC_1 %bb.6, 4, implicit $eflags, debug-location !17 + + bb.13: + liveins: $rsi, $rdi, $eflags + JCC_1 %bb.5, 4, implicit $eflags, debug-location !17 + + bb.14: + liveins: $rsi, $rdi, $eflags + $rsi = MOV64ri 0, debug-location !17 + JCC_1 %bb.4, 4, implicit $eflags, debug-location !17 + + bb.15: + liveins: $rsi, $rdi, $eflags + JCC_1 %bb.3, 4, implicit $eflags, debug-location !17 + + bb.16: + liveins: $rsi, $rdi, $eflags + JCC_1 %bb.2, 4, implicit $eflags, debug-location !17 + + bb.17: + liveins: $rsi, $rdi, $eflags + JCC_1 %bb.1, 4, implicit $eflags, debug-location !17 + + bb.18: + liveins: $rsi, $rdi, $eflags + RETQ + +...