+++ /dev/null
---- |
- ; 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
-
- ; 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 $eax
- ; CHECK-LABEL: bb.1.bb1:
- ; CHECK: DBG_VALUE $ebx
- ; CHECK: DBG_VALUE $ebx
- ; CHECK-LABEL: bb.2.bb2:
- ; CHECK: DBG_VALUE $ebx
- ; CHECK-LABEL: bb.3.bb3:
- ; CHECK: DBG_VALUE $ebx
- ; CHECK: DBG_VALUE $ebx
- ; CHECK-LABEL: bb.4.bb4:
- ; CHECK: DBG_VALUE $ebx
- ; CHECK-LABEL: bb.5.bb5:
- ; 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:
- br label %bb1, !dbg !17
- bb1:
- br label %bb2, !dbg !17
- bb2:
- br label %bb3, !dbg !17
- bb3:
- br label %bb3, !dbg !17
- bb4:
- br label %bb3, !dbg !17
- bb5:
- 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
-body: |
- bb.0.entry:
- successors: %bb.1
- $ebx = MOV32ri 0, debug-location !17
- $eax = COPY $ebx
- DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17
- 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.3, %bb.4
- JCC_1 %bb.4, 4, implicit $eflags
- bb.3.bb3:
- 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.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
-...
+++ /dev/null
---- |
- ; 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
-
-...
+++ /dev/null
---- |
- ; 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
-
-...
#
# 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()
+# CHECK-NEXT: DBG_VALUE $s0, $noreg, !12, !DIExpression(), debug-location !17
--- |
; ModuleID = '<stdin>'
# ...
#
# CHECK: bb.1.if.end:
-# 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)
+# 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
--- |
; ModuleID = '<stdin>'
$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, debug-location !57
+ JCC_1 %bb.9, 4, implicit $eflags
bb.1.if.end:
successors: %bb.2(0x30000000), %bb.3(0x50000000)
$r12 = MOV64rr $rax
$r15 = MOV64rr $r12
renamable $r15 = AND64ri8 killed renamable $r15, -123, implicit-def $eflags
- JCC_1 %bb.2, 4, implicit $eflags, debug-location !57
+ JCC_1 %bb.2, 4, implicit $eflags
bb.3.private.exit:
successors: %bb.9(0x30000000), %bb.4(0x50000000)
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, debug-location !57
+ JCC_1 %bb.9, 4, implicit $eflags
bb.4.if.then8:
successors: %bb.8(0x30000000), %bb.5(0x50000000)
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, debug-location !57
+ JCC_1 %bb.8, 4, implicit $eflags
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, debug-location !57
+ JCC_1 %bb.7, 5, implicit $eflags
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, debug-location !57
+ JCC_1 %bb.8, 4, implicit $eflags
bb.7.if.then14:
successors: %bb.8(0x80000000)
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, debug-location !57
+ CALL64pcrel32 @func6, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit $esi, implicit $rdx, implicit-def $rsp, implicit-def $ssp
bb.8.cleanup:
successors: %bb.9(0x80000000)
renamable $ecx = MOV32ri 1
- JMP_1 %bb.9, debug-location !57
+ JMP_1 %bb.9
bb.2.if.then3:
successors: %bb.9(0x80000000)
$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, debug-location !57
+ renamable $ecx = XOR32rr undef $ecx, undef $ecx, implicit-def dead $eflags
bb.9.cleanup:
liveins: $ecx
$r14 = POP64r implicit-def $rsp, implicit $rsp
$r15 = POP64r implicit-def $rsp, implicit $rsp
$rbp = POP64r implicit-def $rsp, implicit $rsp
- RETQ $eax, debug-location !57
+ RETQ $eax
...
# 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()
-# CHECK-DAG: DBG_VALUE $esi, $noreg, ![[Y_VAR]], !DIExpression()
-# CHECK-DAG: DBG_VALUE $edx, $noreg, ![[Z_VAR]], !DIExpression()
+# 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: RET
--- |
# 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
# 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"
CFI_INSTRUCTION def_cfa_offset 16
CFI_INSTRUCTION offset $rbx, -16
$ebx = MOV32rr $edi
- $eax = MOV32ri 0, debug-location !10
- $ecx = MOV32ri 0, debug-location !10
+ $eax = MOV32ri 0
+ $ecx = MOV32ri 0
DBG_VALUE $ecx, $noreg, !9, !DIExpression(), debug-location !10
- $edi = MOV32ri 0, debug-location !10
- $esi = MOV32ri 0, debug-location !10
+ $edi = MOV32ri 0
+ $esi = MOV32ri 0
bb.1.loop:
successors: %bb.1, %bb.2
liveins: $ebx, $eax, $ecx, $edi, $esi
- $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
+ $eax = COPY $ecx
+ $ebx = COPY killed $ecx
+ $ecx = COPY killed $edi
+ $edi = COPY killed $esi
+ $esi = MOV32ri 1
TEST8ri killed renamable $al, 1, implicit-def $eflags
- JCC_1 %bb.1, 5, implicit killed $eflags, debug-location !10
+ JCC_1 %bb.1, 5, implicit killed $eflags
bb.2.exit:
liveins: $ebx
- $eax = MOV32rr killed $ebx, debug-location !10
+ $eax = MOV32rr killed $ebx
$rbx = frame-destroy POP64r implicit-def $rsp, implicit $rsp
CFI_INSTRUCTION def_cfa_offset 8
- RETQ $eax, debug-location !10
+ RETQ $eax
...
# CHECK: ![[N_VAR:[0-9]+]] = !DILocalVariable(name: "n",{{.*}})
#
# CHECK: bb.5.if.end.7:
-# CHECK: DBG_VALUE $ebx, $noreg, ![[N_VAR]], !DIExpression()
+# CHECK: DBG_VALUE $ebx, $noreg, ![[N_VAR]], !DIExpression(), debug-location !{{[0-9]+}}
--- |
; 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()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.2.bb2:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.3.bb3:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
entry:
; a diamond that doesn't move or clobber their locations.
; CHECK-LABEL: bb.0.entry:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.1.bb1:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.2.bb2:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.3.bb3:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
entry:
; 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()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.1.bb1:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-NEXT: $ebx = MOV32ri 0, debug-location !17
; CHECK-LABEL: bb.2.bb2:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-NEXT: $ebx = MOV32ri 0, debug-location !17
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
; diamond CFG when the location is moved by another instruction.
; CHECK-LABEL: bb.0.entry:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.1.bb1:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-NEXT: $eax = MOV32ri 0, debug-location !17
- ; CHECK-NEXT: DBG_VALUE $eax, $noreg, !16, !DIExpression()
+ ; CHECK-NEXT: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.2.bb2:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-NEXT: $eax = MOV32ri 0, debug-location !17
- ; CHECK-NEXT: DBG_VALUE $eax, $noreg, !16, !DIExpression()
+ ; CHECK-NEXT: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.3.bb3:
- ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
entry:
; of a diamond CFG that clobbers its location.
; CHECK-LABEL: bb.0.entry:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.1.bb1:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.2.bb2:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
entry:
; of a diamond CFG that moves its location.
; CHECK-LABEL: bb.0.entry:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.1.bb1:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-NEXT: $eax = MOV32ri 0, debug-location !17
- ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.2.bb2:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
entry:
; loop that doesn't move or clobber its location.
; CHECK-LABEL: bb.0.entry:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.1.bb1:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.2.bb2:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.3.bb3:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
entry:
; sequential CFG.
; CHECK-LABEL: bb.0.entry:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.1.bb1:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.2.bb2:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.3.bb3:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
entry:
; control flow when it's location is clobbered.
; CHECK-LABEL: bb.0.entry:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.1.bb1:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
entry:
; no control flow when a location is moved and then clobbered.
; CHECK-LABEL: bb.0.entry:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.1.bb1:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-NEXT: $eax = MOV32ri 0, debug-location !17
- ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.2.bb2:
- ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.3.bb3:
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
+++ /dev/null
---- |
- ; 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
-...
; break.
; CHECK-LABEL: bb.0.entry:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.1.bb1:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.2.bb2:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.3.bb3:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.4.bb4:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
entry:
; diamond pattern and beyond.
; CHECK-LABEL: bb.0.entry:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.1.bb1:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.2.bb2:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.3.bb3:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.4.bb4:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.5.bb5:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
entry:
; diamond pattern but not beyond.
; CHECK-LABEL: bb.0.entry:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.1.bb1:
- ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.2.bb2:
- ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.3.bb3:
- ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.4.bb4:
- ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.5.bb5:
- ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
entry:
; backedges and beyond.
; CHECK-LABEL: bb.0.entry:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.1.bb1:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.2.bb2:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.3.bb3:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.4.bb4:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
entry:
; Check that DBG_VALUE instructions are propagated into loops within loops.
; CHECK-LABEL: bb.0.entry:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.1.bb1:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.2.bb2:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.3.bb3:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.4.bb4:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.5.bb5:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
entry:
; loops that move their locations.
; CHECK-LABEL: bb.0.entry:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.3.bb3:
- ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
entry:
; loops that move their locations.
; CHECK-LABEL: bb.0.entry:
- ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $ebx, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.4.bb4:
- ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17
; CHECK-LABEL: bb.5.bb5:
- ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression()
+ ; CHECK: DBG_VALUE $eax, $noreg, !16, !DIExpression(), debug-location !17
define i32 @_Z8bb_to_bb() local_unnamed_addr !dbg !12 {
entry:
+++ /dev/null
---- |
- ; 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
-
-...