live-debug-values-bundled-entry-values.mir
6.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# RUN: llc -debug-entry-values -run-pass=livedebugvalues -o - %s | FileCheck %s
# Verify that the entry values for the input parameters are inserted after the
# bundles which contains the registers' clobbering instructions (the calls to
# @clobber). Previously the insertions would thrash the bundles, later on
# triggering a crash in DebugHandlerBase.
--- |
target datalayout = "e-m:e-p:32:32:32-a:0-n16:32-i64:64:64-i32:32:32-i16:16:16-i1:8:8-f32:32:32-f64:64:64-v32:32:32-v64:64:64-v512:512:512-v1024:1024:1024-v2048:2048:2048"
target triple = "hexagon"
; Function Attrs: nounwind
define i32 @foo(i32 %arg) !dbg !12 {
entry:
call void @llvm.dbg.value(metadata i32 %arg, metadata !16, metadata !DIExpression()), !dbg !17
%call = tail call i32 @clobber(), !dbg !18
ret i32 1, !dbg !19
}
declare !dbg !4 i32 @clobber()
; Function Attrs: nounwind
define i32 @bar(i32 %b) !dbg !20 {
entry:
call void @llvm.dbg.value(metadata i32 %b, metadata !22, metadata !DIExpression()), !dbg !23
%tobool = icmp eq i32 %b, 0, !dbg !24
br i1 %tobool, label %land.end, label %land.rhs, !dbg !24
land.rhs: ; preds = %entry
%call = tail call i32 @clobber(), !dbg !25
br label %land.end
land.end: ; preds = %entry, %land.rhs
ret i32 undef, !dbg !27
}
; Function Attrs: nounwind readnone speculatable
declare void @llvm.dbg.value(metadata, metadata, metadata) #0
attributes #0 = { nounwind readnone speculatable }
!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!8, !9, !10}
!llvm.ident = !{!11}
!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 10.0.0", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2, retainedTypes: !3, nameTableKind: None)
!1 = !DIFile(filename: "foo.c", directory: "/")
!2 = !{}
!3 = !{!4}
!4 = !DISubprogram(name: "clobber", scope: !1, file: !1, line: 1, type: !5, flags: DIFlagPrototyped, spFlags: DISPFlagOptimized, retainedNodes: !2)
!5 = !DISubroutineType(types: !6)
!6 = !{!7}
!7 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
!8 = !{i32 2, !"Dwarf Version", i32 4}
!9 = !{i32 2, !"Debug Info Version", i32 3}
!10 = !{i32 1, !"wchar_size", i32 4}
!11 = !{!"clang version 10.0.0"}
!12 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 3, type: !13, scopeLine: 3, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !15)
!13 = !DISubroutineType(types: !14)
!14 = !{!7, !7}
!15 = !{!16}
!16 = !DILocalVariable(name: "arg", arg: 1, scope: !12, file: !1, line: 3, type: !7)
!17 = !DILocation(line: 0, scope: !12)
!18 = !DILocation(line: 4, scope: !12)
!19 = !DILocation(line: 5, scope: !12)
!20 = distinct !DISubprogram(name: "bar", scope: !1, file: !1, line: 8, type: !13, scopeLine: 8, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !21)
!21 = !{!22}
!22 = !DILocalVariable(name: "arg", arg: 1, scope: !20, file: !1, line: 8, type: !7)
!23 = !DILocation(line: 0, scope: !20)
!24 = !DILocation(line: 9, scope: !20)
!25 = !DILocation(line: 9, scope: !26)
!26 = distinct !DILexicalBlock(scope: !20, file: !1, line: 9)
!27 = !DILocation(line: 10, scope: !20)
...
---
name: foo
tracksRegLiveness: true
body: |
bb.0.entry:
DBG_VALUE $r0, $noreg, !16, !DIExpression(), debug-location !17
CFI_INSTRUCTION def_cfa $r30, 8
CFI_INSTRUCTION offset $r31, -4
CFI_INSTRUCTION offset $r30, -8
BUNDLE implicit-def $r29, implicit-def $r30, implicit-def dead $pc, implicit-def dead $r31, implicit-def dead $r0, implicit $r29, implicit killed $framekey, implicit killed $framelimit, implicit killed $r30, implicit killed $r31, debug-location !18 {
$r29 = S2_allocframe $r29, 0, implicit-def $r30, implicit killed $framekey, implicit killed $framelimit, implicit killed $r30, implicit killed $r31, debug-location !18 :: (store 4 into stack)
J2_call @clobber, hexagoncsr, implicit-def dead $pc, implicit-def dead $r31, implicit internal killed $r29, implicit-def $r29, implicit-def dead $r0, debug-location !18
}
BUNDLE implicit-def dead $r0, implicit-def $d15, implicit-def $r30, implicit-def $r31, implicit-def $pc, implicit-def $r29, implicit killed $r30, implicit killed $framekey, debug-location !19 {
$r0 = A2_tfrsi 1, debug-location !19
$d15 = L4_return killed $r30, implicit-def $pc, implicit-def $r29, implicit killed $framekey, implicit-def dead $pc, implicit internal killed $r0, debug-location !19
}
...
# CHECK-LABEL: name: foo
# CHECK: BUNDLE
# CHECK-NEXT: $r29 = S2_allocframe $r29, 0
# CHECK-NEXT: J2_call @clobber
# CHECK-NEXT: }
# CHECK-NEXT: DBG_VALUE $r0, $noreg, !16, !DIExpression(DW_OP_LLVM_entry_value, 1)
---
name: bar
tracksRegLiveness: true
liveins:
- { reg: '$r0' }
body: |
bb.0.entry:
successors: %bb.1
liveins: $r0
DBG_VALUE $r0, $noreg, !22, !DIExpression(), debug-location !23
DBG_VALUE $r0, $noreg, !22, !DIExpression(), debug-location !23
BUNDLE implicit-def dead $p0, implicit-def $pc, implicit killed $r0, implicit killed $r31, debug-location !24 {
renamable $p0 = C2_cmpeqi killed renamable $r0, 0, debug-location !24
PS_jmprettnew internal killed $p0, killed $r31, implicit-def $pc, implicit-def $pc, implicit killed undef $r0, debug-location !27
}
bb.1.land.rhs:
CFI_INSTRUCTION def_cfa $r30, 8
CFI_INSTRUCTION offset $r31, -4
CFI_INSTRUCTION offset $r30, -8
BUNDLE implicit-def $r29, implicit-def $r30, implicit-def $pc, implicit-def $r31, implicit-def dead $r0, implicit $r29, implicit killed $framekey, implicit killed $framelimit, implicit killed $r30, implicit killed $r31, debug-location !25 {
$r29 = S2_allocframe $r29, 0, implicit-def $r30, implicit killed $framekey, implicit killed $framelimit, implicit killed $r30, implicit killed $r31, debug-location !25 :: (store 4 into stack)
J2_call @clobber, hexagoncsr, implicit-def $pc, implicit-def $r31, implicit internal killed $r29, implicit-def $r29, implicit-def dead $r0, debug-location !25
}
$d15 = L2_deallocframe killed $r30, implicit-def $r29, implicit killed $framekey
PS_jmpret killed $r31, implicit-def $pc, implicit killed undef $r0, debug-location !27
...
# CHECK-LABEL: name: bar
# CHECK: BUNDLE
# CHECK: BUNDLE
# CHECK-NEXT: $r29 = S2_allocframe $r29, 0
# CHECK-NEXT: J2_call @clobber
# CHECK-NEXT: }
# CHECK-NEXT: DBG_VALUE $r0, $noreg, !22, !DIExpression(DW_OP_LLVM_entry_value, 1)