260 lines
8.0 KiB
Plaintext
260 lines
8.0 KiB
Plaintext
|
# RUN: llc %s -o - -run-pass=livedebugvalues | FileCheck %s
|
||
|
#
|
||
|
# The first func tests that, for two independent variable fragments defined in
|
||
|
# blocks 1 and 2, _both_ their locations are propagated into the exit block.
|
||
|
# LiveDebugValues previously ignored fragments and only propagated the last
|
||
|
# variable location seen.
|
||
|
#
|
||
|
# The second func tests that overlapping variable fragments are handled
|
||
|
# correctly -- that the redefinition of a particular fragment also clobbers
|
||
|
# any overlaps. The dbg value of $cx in block one should not be propagated to
|
||
|
# block two, because an overlapping dbg value inst has been encountered.
|
||
|
#
|
||
|
# The third function checks that DBG_VALUEs without fragments are seen as
|
||
|
# overlapping any DBG_VALUE with a fragment.
|
||
|
#
|
||
|
# CHECK-LABEL: foo
|
||
|
# CHECK-LABEL: bb.3.bb3:
|
||
|
# CHECK: DBG_VALUE $ebx, $noreg, !{{[0-9]+}},
|
||
|
# CHECK-SAME: !DIExpression(DW_OP_LLVM_fragment, 32, 32)
|
||
|
# CHECK-NEXT: DBG_VALUE $eax, $noreg, !{{[0-9]+}},
|
||
|
# CHECK-SAME: !DIExpression(DW_OP_LLVM_fragment, 0, 32)
|
||
|
# CHECK-NEXT: XOR32rr
|
||
|
# CHECK-NEXT: RETQ
|
||
|
#
|
||
|
# CHECK-LABEL: bar
|
||
|
# CHECK-LABEL: bb.0.entry:
|
||
|
# CHECK: DBG_VALUE $cx, $noreg, !{{[0-9]+}},
|
||
|
# CHECK-SAME: !DIExpression(DW_OP_LLVM_fragment, 0, 16)
|
||
|
|
||
|
# CHECK-LABEL: bb.1.bb1:
|
||
|
# CHECK: DBG_VALUE $cx, $noreg, !{{[0-9]+}},
|
||
|
# CHECK-SAME: !DIExpression(DW_OP_LLVM_fragment, 0, 16)
|
||
|
# CHECK-NEXT: MOV32rr
|
||
|
# CHECK-NEXT: DBG_VALUE $ax, $noreg, !{{[0-9]+}},
|
||
|
# CHECK-SAME: !DIExpression(DW_OP_LLVM_fragment, 8, 16)
|
||
|
# CHECK-NEXT: JMP_1
|
||
|
|
||
|
# CHECK-LABEL: bb.2.bb2:
|
||
|
# CHECK-NOT: DBG_VALUE
|
||
|
# CHECK: DBG_VALUE $ax, $noreg, !{{[0-9]+}},
|
||
|
# CHECK-SAME: !DIExpression(DW_OP_LLVM_fragment, 8, 16)
|
||
|
# CHECK-NEXT: MOV32rr
|
||
|
# CHECK-NEXT: ADD32ri8
|
||
|
# CHECK-NEXT: DBG_VALUE $ebx, $noreg, !{{[0-9]+}},
|
||
|
# CHECK-SAME: !DIExpression(DW_OP_LLVM_fragment, 32, 32)
|
||
|
# CHECK-NEXT: JMP_1
|
||
|
|
||
|
# CHECK-LABEL: bb.3.bb3:
|
||
|
# CHECK: DBG_VALUE $ebx, $noreg, !{{[0-9]+}},
|
||
|
# CHECK-SAME: !DIExpression(DW_OP_LLVM_fragment, 32, 32)
|
||
|
# CHECK-NEXT: DBG_VALUE $ax, $noreg, !{{[0-9]+}},
|
||
|
# CHECK-SAME: !DIExpression(DW_OP_LLVM_fragment, 8, 16)
|
||
|
# CHECK-NEXT: XOR32rr
|
||
|
# CHECK-NEXT: RETQ
|
||
|
|
||
|
# CHECK-LABEL: baz
|
||
|
# CHECK-LABEL: bb.0.entry:
|
||
|
# CHECK: DBG_VALUE $cx, $noreg, !{{[0-9]+}},
|
||
|
# CHECK-SAME: !DIExpression(DW_OP_LLVM_fragment, 0, 16)
|
||
|
# CHECK-NEXT: JMP_1 %bb.1
|
||
|
#
|
||
|
# CHECK-LABEL: bb.1.bb1:
|
||
|
# CHECK: DBG_VALUE $cx, $noreg, !{{[0-9]+}},
|
||
|
# CHECK-SAME: !DIExpression(DW_OP_LLVM_fragment, 0, 16)
|
||
|
# CHECK-NEXT: MOV32rr
|
||
|
# CHECK-NEXT: DBG_VALUE $rdi, $noreg, !{{[0-9]+}}, !DIExpression()
|
||
|
# CHECK-NEXT: JMP_1 %bb.2
|
||
|
#
|
||
|
# CHECK-LABEL: bb.2.bb2:
|
||
|
# CHECK-NOT: DBG_VALUE $cx
|
||
|
# CHECK: DBG_VALUE $rdi, $noreg, !{{[0-9]+}}, !DIExpression()
|
||
|
# CHECK-NEXT: MOV32rr
|
||
|
# CHECK-NEXT: ADD32ri8
|
||
|
# CHECK-NEXT: DBG_VALUE $ebx, $noreg, !{{[0-9]+}},
|
||
|
# CHECK-SAME: !DIExpression(DW_OP_LLVM_fragment, 32, 32)
|
||
|
# CHECK-NEXT: JMP_1 %bb.3
|
||
|
#
|
||
|
# CHECK-LABEL: bb.3.bb3:
|
||
|
# CHECK-NOT: DBG_VALUE $rdi
|
||
|
# CHECK-NOT: DBG_VALUE $cx
|
||
|
# CHECK: DBG_VALUE $ebx, $noreg, !{{[0-9]+}},
|
||
|
# CHECK-SAME: !DIExpression(DW_OP_LLVM_fragment, 32, 32)
|
||
|
# CHECK-NEXT: XOR32rr
|
||
|
# CHECK-NEXT: RETQ
|
||
|
|
||
|
--- |
|
||
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||
|
target triple = "x86_64-unknown-linux-gnu"
|
||
|
|
||
|
define i32 @foo(i32* %bees, i32* %output) !dbg !4 {
|
||
|
entry:
|
||
|
br label %bb1
|
||
|
bb1:
|
||
|
br label %bb2
|
||
|
bb2:
|
||
|
br label %bb3
|
||
|
bb3:
|
||
|
ret i32 0
|
||
|
}
|
||
|
|
||
|
define i32 @bar(i32* %bees, i32* %output) !dbg !40 {
|
||
|
entry:
|
||
|
br label %bb1
|
||
|
bb1:
|
||
|
br label %bb2
|
||
|
bb2:
|
||
|
br label %bb3
|
||
|
bb3:
|
||
|
ret i32 0
|
||
|
}
|
||
|
|
||
|
define i32 @baz(i32* %bees, i32* %output) !dbg !80 {
|
||
|
entry:
|
||
|
br label %bb1
|
||
|
bb1:
|
||
|
br label %bb2
|
||
|
bb2:
|
||
|
br label %bb3
|
||
|
bb3:
|
||
|
ret i32 0
|
||
|
}
|
||
|
|
||
|
!llvm.module.flags = !{!0, !100}
|
||
|
!llvm.dbg.cu = !{!1}
|
||
|
|
||
|
!100 = !{i32 2, !"Dwarf Version", i32 4}
|
||
|
!0 = !{i32 2, !"Debug Info Version", i32 3}
|
||
|
!1 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !2, producer: "beards", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
|
||
|
!2 = !DIFile(filename: "bees.cpp", directory: ".")
|
||
|
!3 = !DILocalVariable(name: "flannel", scope: !4, file: !2, line: 1, type: !16)
|
||
|
!4 = distinct !DISubprogram(name: "nope", scope: !2, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !13, type: !14, isDefinition: true)
|
||
|
!8 = !DILocation(line: 4, scope: !4)
|
||
|
!13 = !{!3}
|
||
|
!14 = !DISubroutineType(types: !15)
|
||
|
!15 = !{!16}
|
||
|
!16 = !DIBasicType(name: "looong", size: 64, align: 64, encoding: DW_ATE_signed)
|
||
|
!40 = distinct !DISubprogram(name: "toast", scope: !2, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !53, type: !14, isDefinition: true)
|
||
|
!43 = !DILocalVariable(name: "charm", scope: !40, file: !2, line: 1, type: !16)
|
||
|
!48 = !DILocation(line: 4, scope: !40)
|
||
|
!53 = !{!43}
|
||
|
!80 = distinct !DISubprogram(name: "mort", scope: !2, file: !2, line: 1, spFlags: DISPFlagDefinition, unit: !1, retainedNodes: !93, type: !14, isDefinition: true)
|
||
|
!83 = !DILocalVariable(name: "bodkin", scope: !80, file: !2, line: 1, type: !16)
|
||
|
!88 = !DILocation(line: 4, scope: !80)
|
||
|
!93 = !{!83}
|
||
|
|
||
|
...
|
||
|
---
|
||
|
name: foo
|
||
|
tracksRegLiveness: true
|
||
|
registers: []
|
||
|
liveins:
|
||
|
- { reg: '$rdi', virtual-reg: '' }
|
||
|
body: |
|
||
|
bb.0.entry:
|
||
|
successors: %bb.1
|
||
|
liveins: $rdi
|
||
|
|
||
|
$ecx = XOR32rr undef $ecx, undef $ecx, implicit-def $eflags
|
||
|
JMP_1 %bb.1
|
||
|
|
||
|
bb.1.bb1 (align 4):
|
||
|
successors: %bb.2
|
||
|
liveins: $ecx, $rdi
|
||
|
|
||
|
$eax = MOV32rr killed $ecx, implicit-def $rax
|
||
|
DBG_VALUE $eax, $noreg, !3, !DIExpression(DW_OP_LLVM_fragment, 0, 32), debug-location !8
|
||
|
JMP_1 %bb.2
|
||
|
|
||
|
bb.2.bb2:
|
||
|
successors: %bb.3
|
||
|
liveins: $eax
|
||
|
|
||
|
$ebx = MOV32rr $eax
|
||
|
$ebx = ADD32ri8 $ebx, 3, implicit-def dead $eflags, implicit killed $rbx, implicit-def $rbx
|
||
|
DBG_VALUE $ebx, $noreg, !3, !DIExpression(DW_OP_LLVM_fragment, 32, 32), debug-location !8
|
||
|
JMP_1 %bb.3
|
||
|
|
||
|
bb.3.bb3:
|
||
|
liveins: $eax, $ebx
|
||
|
$eax = XOR32rr killed $eax, killed $ebx, implicit-def $eflags
|
||
|
RETQ $eax, debug-location !8
|
||
|
|
||
|
...
|
||
|
---
|
||
|
name: bar
|
||
|
tracksRegLiveness: true
|
||
|
registers: []
|
||
|
liveins:
|
||
|
- { reg: '$rdi', virtual-reg: '' }
|
||
|
body: |
|
||
|
bb.0.entry:
|
||
|
successors: %bb.1
|
||
|
liveins: $rdi
|
||
|
|
||
|
$ecx = XOR32rr undef $ecx, undef $ecx, implicit-def $eflags
|
||
|
DBG_VALUE $cx, $noreg, !43, !DIExpression(DW_OP_LLVM_fragment, 0, 16), debug-location !48
|
||
|
JMP_1 %bb.1
|
||
|
|
||
|
bb.1.bb1:
|
||
|
successors: %bb.2
|
||
|
liveins: $ecx, $rdi
|
||
|
|
||
|
$eax = MOV32rr killed $ecx, implicit-def $rax
|
||
|
DBG_VALUE $ax, $noreg, !43, !DIExpression(DW_OP_LLVM_fragment, 8, 16), debug-location !48
|
||
|
JMP_1 %bb.2
|
||
|
|
||
|
bb.2.bb2:
|
||
|
successors: %bb.3
|
||
|
liveins: $eax
|
||
|
|
||
|
$ebx = MOV32rr $eax
|
||
|
$ebx = ADD32ri8 $ebx, 3, implicit-def dead $eflags, implicit killed $rbx, implicit-def $rbx
|
||
|
DBG_VALUE $ebx, $noreg, !43, !DIExpression(DW_OP_LLVM_fragment, 32, 32), debug-location !48
|
||
|
JMP_1 %bb.3
|
||
|
|
||
|
bb.3.bb3:
|
||
|
liveins: $eax, $ebx
|
||
|
$eax = XOR32rr killed $eax, killed $ebx, implicit-def $eflags
|
||
|
RETQ $eax, debug-location !48
|
||
|
|
||
|
...
|
||
|
---
|
||
|
name: baz
|
||
|
tracksRegLiveness: true
|
||
|
registers: []
|
||
|
liveins:
|
||
|
- { reg: '$rdi', virtual-reg: '' }
|
||
|
body: |
|
||
|
bb.0.entry:
|
||
|
successors: %bb.1
|
||
|
liveins: $rdi
|
||
|
|
||
|
$ecx = XOR32rr undef $ecx, undef $ecx, implicit-def $eflags
|
||
|
DBG_VALUE $cx, $noreg, !83, !DIExpression(DW_OP_LLVM_fragment, 0, 16), debug-location !88
|
||
|
JMP_1 %bb.1
|
||
|
|
||
|
bb.1.bb1:
|
||
|
successors: %bb.2
|
||
|
liveins: $ecx, $rdi
|
||
|
|
||
|
$eax = MOV32rr killed $ecx, implicit-def $rax
|
||
|
DBG_VALUE $rdi, $noreg, !83, !DIExpression(), debug-location !88
|
||
|
JMP_1 %bb.2
|
||
|
|
||
|
bb.2.bb2:
|
||
|
successors: %bb.3
|
||
|
liveins: $eax
|
||
|
|
||
|
$ebx = MOV32rr $eax
|
||
|
$ebx = ADD32ri8 $ebx, 3, implicit-def dead $eflags, implicit killed $rbx, implicit-def $rbx
|
||
|
DBG_VALUE $ebx, $noreg, !83, !DIExpression(DW_OP_LLVM_fragment, 32, 32), debug-location !88
|
||
|
JMP_1 %bb.3
|
||
|
|
||
|
bb.3.bb3:
|
||
|
liveins: $eax, $ebx
|
||
|
$eax = XOR32rr killed $eax, killed $ebx, implicit-def $eflags
|
||
|
RETQ $eax, debug-location !88
|
||
|
|
||
|
...
|