blob: 84b1514670cc678f742dd119a8599c6fc9168467 [file] [log] [blame]
Devang Patel59c97b52010-09-13 22:47:46 +00001; This test case checks handling of llvm.dbg.declare intrinsic during fast-isel.
Devang Patel90955222011-03-28 20:00:34 +00002; RUN: %clang -arch x86_64 -O0 -g %s -c -o %t.o
3; RUN: %clang -arch x86_64 %t.o -o %t.out
Devang Patel59c97b52010-09-13 22:47:46 +00004; RUN: %test_debuginfo %s %t.out
Argyrios Kyrtzidis8f688172012-10-20 01:38:50 +00005;
6; REQUIRES: system-darwin
Devang Patel59c97b52010-09-13 22:47:46 +00007
8target triple = "x86_64-apple-darwin"
9%struct.XYZ = type { i32, i32, i32, i32, i32 }
10
11; Check handling of llvm.dbg.declare for an argument referred through alloca, where
12; alloca dominates llvm.dbg.declare
13define i32 @f1(i32 %i) nounwind ssp {
14; DEBUGGER: break f1
15; DEBUGGER: r
16; DEBUGGER: p i
17; CHECK: $1 = 42
18entry:
19 %i.addr = alloca i32, align 4
20 store i32 %i, i32* %i.addr, align 4
21 call void @llvm.dbg.declare(metadata !{i32* %i.addr}, metadata !16), !dbg !17
22 %tmp = load i32* %i.addr, align 4, !dbg !18
23 ret i32 %tmp, !dbg !18
24}
25
26declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
27
28; Check handling of llvm.dbg.declare for an argument referred through alloca, where
29; llvm.dbg.declare dominates alloca.
30define i32 @f2(i32 %i) nounwind ssp {
31; DEBUGGER: break f2
32; DEBUGGER: c
33; DEBUGGER: p i
34; CHECK: $2 = 43
35entry:
36 call void @llvm.dbg.declare(metadata !{i32* %i.addr}, metadata !20), !dbg !21
37 %i.addr = alloca i32, align 4
38 store i32 %i, i32* %i.addr, align 4
39 %tmp = load i32* %i.addr, align 4, !dbg !22
40 ret i32 %tmp, !dbg !22
41}
42
43; If llvm.dbg.declare is using an argument after its last use then register
44; allocator may destroy debug info for the argument. This is expected and
45; it should be fixed before registers are allocated.
46define i32 @f3(i32 %i) nounwind ssp {
47entry:
48 %i.addr = alloca i32, align 4
49 store i32 %i, i32* %i.addr, align 4
50 call void @llvm.dbg.declare(metadata !{i32 %i}, metadata !24), !dbg !25
51 %tmp = load i32* %i.addr, align 4, !dbg !26
52 ret i32 %tmp, !dbg !26
53}
54
55; Check handling of an argument referred directly by llvm.dbg.declare where
56; llvm.dbg.declare dominates all uses of argument.
57define i32 @f4(i32 %i) nounwind ssp {
Devang Patel5fd13062010-09-14 20:29:59 +000058; DEBUGGER: break f4
59; DEBUGGER: c
60; DEBUGGER: p i
61; CHECK: $3 = 45
Devang Patel59c97b52010-09-13 22:47:46 +000062entry:
63 call void @llvm.dbg.declare(metadata !{i32 %i}, metadata !28), !dbg !29
64 ret i32 %i, !dbg !30
65}
66
67; Check handling of an argument referred directly by llvm.dbg.declare where
68; llvm.dbg.declare dominates all uses of argument in separate basic block.
69define i32 @f5(i32 %i) nounwind ssp {
Devang Patel5fd13062010-09-14 20:29:59 +000070; DEBUGGER: break f5
71; DEBUGGER: c
72; DEBUGGER: p i
73; CHECK: $4 = 46
Devang Patel59c97b52010-09-13 22:47:46 +000074entry:
75 call void @llvm.dbg.declare(metadata !{i32 %i}, metadata !32), !dbg !33
76 br label %bbr
77bbr:
78 ret i32 %i, !dbg !34
79}
80
81; Check handling of an argument referred directly by llvm.dbg.declare where
82; argument is not used.
83define i32 @f6(i32 %i) nounwind ssp {
84entry:
85 call void @llvm.dbg.declare(metadata !{i32 %i}, metadata !36), !dbg !37
86 ret i32 1, !dbg !38
87}
88
89; Check handling of an byval argument referred directly by llvm.dbg.declare where
90; argument is not used.
91define i32 @f7(%struct.XYZ* byval %i) nounwind ssp {
92entry:
93 call void @llvm.dbg.declare(metadata !{%struct.XYZ* %i}, metadata !40), !dbg !48
94 ret i32 1, !dbg !49
95}
96
97; Check handling of an byval argument referred directly by llvm.dbg.declare where
98; argument use dominates llvm.dbg.declare.
99define i32 @f8(%struct.XYZ* byval %i) nounwind ssp {
Devang Patel5fd13062010-09-14 20:29:59 +0000100; DEBUGGER: break f8
101; DEBUGGER: c
102; DEBUGGER: p i.x
103; CHECK: $5 = 51
Devang Patel59c97b52010-09-13 22:47:46 +0000104entry:
105 %tmp = getelementptr inbounds %struct.XYZ* %i, i32 0, i32 1, !dbg !53
106 %tmp1 = load i32* %tmp, align 4, !dbg !53
107 call void @llvm.dbg.declare(metadata !{%struct.XYZ* %i}, metadata !51), !dbg !52
108 ret i32 %tmp1, !dbg !53
109}
110
111; Check handling of an byval argument referred directly by llvm.dbg.declare where
112; llvm.dbg.declare dominates all uses of argument.
113define i32 @f9(%struct.XYZ* byval %i) nounwind ssp {
114; DEBUGGER: break f9
115; DEBUGGER: c
116; DEBUGGER: p i.x
Devang Patel5fd13062010-09-14 20:29:59 +0000117; CHECK: $6 = 51
Devang Patel59c97b52010-09-13 22:47:46 +0000118entry:
119 call void @llvm.dbg.declare(metadata !{%struct.XYZ* %i}, metadata !55), !dbg !56
120 %tmp = getelementptr inbounds %struct.XYZ* %i, i32 0, i32 2, !dbg !57
121 %tmp1 = load i32* %tmp, align 4, !dbg !57
122 ret i32 %tmp1, !dbg !57
123}
124
125; Check handling of an byval argument referred directly by llvm.dbg.declare where
126; llvm.dbg.declare dominates all uses of argument in separate basic block.
127define i32 @f10(%struct.XYZ* byval %i) nounwind ssp {
128entry:
129 call void @llvm.dbg.declare(metadata !{%struct.XYZ* %i}, metadata !59), !dbg !60
130 br label %bbr
131bbr:
132 %tmp = getelementptr inbounds %struct.XYZ* %i, i32 0, i32 3, !dbg !61
133 %tmp1 = load i32* %tmp, align 4, !dbg !61
134 ret i32 %tmp1, !dbg !61
135}
136
137define i32 @main() nounwind ssp {
138entry:
139 %retval = alloca i32, align 4
140 %abc = alloca %struct.XYZ, align 4
141 %agg.tmp = alloca %struct.XYZ, align 4
142 %agg.tmp13 = alloca %struct.XYZ, align 4
143 %agg.tmp17 = alloca %struct.XYZ, align 4
144 %agg.tmp21 = alloca %struct.XYZ, align 4
145 store i32 0, i32* %retval
146 %call = call i32 @f1(i32 42), !dbg !63
147 %call1 = call i32 @f2(i32 43), !dbg !65
148 %call2 = call i32 @f3(i32 44), !dbg !66
149 %call3 = call i32 @f4(i32 45), !dbg !67
150 %call4 = call i32 @f5(i32 46), !dbg !68
151 %call5 = call i32 @f6(i32 47), !dbg !69
152 call void @llvm.dbg.declare(metadata !{%struct.XYZ* %abc}, metadata !70), !dbg !71
153 %tmp = getelementptr inbounds %struct.XYZ* %abc, i32 0, i32 0, !dbg !72
154 store i32 51, i32* %tmp, align 4, !dbg !72
155 %tmp6 = getelementptr inbounds %struct.XYZ* %abc, i32 0, i32 1, !dbg !72
156 store i32 52, i32* %tmp6, align 4, !dbg !72
157 %tmp7 = getelementptr inbounds %struct.XYZ* %abc, i32 0, i32 2, !dbg !72
158 store i32 53, i32* %tmp7, align 4, !dbg !72
159 %tmp8 = getelementptr inbounds %struct.XYZ* %abc, i32 0, i32 3, !dbg !72
160 store i32 54, i32* %tmp8, align 4, !dbg !72
161 %tmp9 = getelementptr inbounds %struct.XYZ* %abc, i32 0, i32 4, !dbg !72
162 store i32 55, i32* %tmp9, align 4, !dbg !72
163 %tmp10 = bitcast %struct.XYZ* %agg.tmp to i8*, !dbg !73
164 %tmp11 = bitcast %struct.XYZ* %abc to i8*, !dbg !73
165 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp10, i8* %tmp11, i64 20, i32 4, i1 false), !dbg !73
166 %call12 = call i32 @f7(%struct.XYZ* byval %agg.tmp), !dbg !73
167 %tmp14 = bitcast %struct.XYZ* %agg.tmp13 to i8*, !dbg !74
168 %tmp15 = bitcast %struct.XYZ* %abc to i8*, !dbg !74
169 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp14, i8* %tmp15, i64 20, i32 4, i1 false), !dbg !74
170 %call16 = call i32 @f8(%struct.XYZ* byval %agg.tmp13), !dbg !74
171 %tmp18 = bitcast %struct.XYZ* %agg.tmp17 to i8*, !dbg !75
172 %tmp19 = bitcast %struct.XYZ* %abc to i8*, !dbg !75
173 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp18, i8* %tmp19, i64 20, i32 4, i1 false), !dbg !75
174 %call20 = call i32 @f9(%struct.XYZ* byval %agg.tmp17), !dbg !75
175 %tmp22 = bitcast %struct.XYZ* %agg.tmp21 to i8*, !dbg !76
176 %tmp23 = bitcast %struct.XYZ* %abc to i8*, !dbg !76
177 call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp22, i8* %tmp23, i64 20, i32 4, i1 false), !dbg !76
178 %call24 = call i32 @f10(%struct.XYZ* byval %agg.tmp21), !dbg !76
179 ret i32 0, !dbg !77
180}
181
182declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind
183
184!llvm.dbg.sp = !{!0, !6, !7, !8, !9, !10, !11, !12, !13, !14, !15}
185
186!0 = metadata !{i32 524334, i32 0, metadata !1, metadata !"f1", metadata !"f1", metadata !"f1", metadata !1, i32 11, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 (i32)* @f1} ; [ DW_TAG_subprogram ]
Devang Patel30a67a12011-05-31 23:57:48 +0000187!1 = metadata !{i32 524329, metadata !"fastisel_arg.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ]
188!2 = metadata !{i32 524305, i32 0, i32 12, metadata !"fastisel_arg.c", metadata !"/private/tmp", metadata !"clang version 2.8 (trunk 112967)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ]
Devang Patel59c97b52010-09-13 22:47:46 +0000189!3 = metadata !{i32 524309, metadata !1, metadata !"", metadata !1, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_subroutine_type ]
190!4 = metadata !{metadata !5}
191!5 = metadata !{i32 524324, metadata !1, metadata !"int", metadata !1, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]
192!6 = metadata !{i32 524334, i32 0, metadata !1, metadata !"f2", metadata !"f2", metadata !"f2", metadata !1, i32 12, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 (i32)* @f2} ; [ DW_TAG_subprogram ]
193!7 = metadata !{i32 524334, i32 0, metadata !1, metadata !"f3", metadata !"f3", metadata !"f3", metadata !1, i32 13, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 (i32)* @f3} ; [ DW_TAG_subprogram ]
194!8 = metadata !{i32 524334, i32 0, metadata !1, metadata !"f4", metadata !"f4", metadata !"f4", metadata !1, i32 14, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 (i32)* @f4} ; [ DW_TAG_subprogram ]
195!9 = metadata !{i32 524334, i32 0, metadata !1, metadata !"f5", metadata !"f5", metadata !"f5", metadata !1, i32 15, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 (i32)* @f5} ; [ DW_TAG_subprogram ]
196!10 = metadata !{i32 524334, i32 0, metadata !1, metadata !"f6", metadata !"f6", metadata !"f6", metadata !1, i32 16, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 (i32)* @f6} ; [ DW_TAG_subprogram ]
197!11 = metadata !{i32 524334, i32 0, metadata !1, metadata !"f7", metadata !"f7", metadata !"f7", metadata !1, i32 17, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 (%struct.XYZ*)* @f7} ; [ DW_TAG_subprogram ]
198!12 = metadata !{i32 524334, i32 0, metadata !1, metadata !"f8", metadata !"f8", metadata !"f8", metadata !1, i32 18, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 (%struct.XYZ*)* @f8} ; [ DW_TAG_subprogram ]
199!13 = metadata !{i32 524334, i32 0, metadata !1, metadata !"f9", metadata !"f9", metadata !"f9", metadata !1, i32 19, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 (%struct.XYZ*)* @f9} ; [ DW_TAG_subprogram ]
200!14 = metadata !{i32 524334, i32 0, metadata !1, metadata !"f10", metadata !"f10", metadata !"f10", metadata !1, i32 20, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 (%struct.XYZ*)* @f10} ; [ DW_TAG_subprogram ]
201!15 = metadata !{i32 524334, i32 0, metadata !1, metadata !"main", metadata !"main", metadata !"main", metadata !1, i32 23, metadata !3, i1 false, i1 true, i32 0, i32 0, null, i1 false, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ]
202!16 = metadata !{i32 524545, metadata !0, metadata !"i", metadata !1, i32 11, metadata !5} ; [ DW_TAG_arg_variable ]
203!17 = metadata !{i32 11, i32 12, metadata !0, null}
204!18 = metadata !{i32 11, i32 17, metadata !19, null}
205!19 = metadata !{i32 524299, metadata !0, i32 11, i32 15, metadata !1, i32 0} ; [ DW_TAG_lexical_block ]
206!20 = metadata !{i32 524545, metadata !6, metadata !"i", metadata !1, i32 12, metadata !5} ; [ DW_TAG_arg_variable ]
207!21 = metadata !{i32 12, i32 12, metadata !6, null}
208!22 = metadata !{i32 12, i32 17, metadata !23, null}
209!23 = metadata !{i32 524299, metadata !6, i32 12, i32 15, metadata !1, i32 1} ; [ DW_TAG_lexical_block ]
210!24 = metadata !{i32 524545, metadata !7, metadata !"i", metadata !1, i32 13, metadata !5} ; [ DW_TAG_arg_variable ]
211!25 = metadata !{i32 13, i32 12, metadata !7, null}
212!26 = metadata !{i32 13, i32 17, metadata !27, null}
213!27 = metadata !{i32 524299, metadata !7, i32 13, i32 15, metadata !1, i32 2} ; [ DW_TAG_lexical_block ]
214!28 = metadata !{i32 524545, metadata !8, metadata !"i", metadata !1, i32 14, metadata !5} ; [ DW_TAG_arg_variable ]
215!29 = metadata !{i32 14, i32 12, metadata !8, null}
216!30 = metadata !{i32 14, i32 17, metadata !31, null}
217!31 = metadata !{i32 524299, metadata !8, i32 14, i32 15, metadata !1, i32 3} ; [ DW_TAG_lexical_block ]
218!32 = metadata !{i32 524545, metadata !9, metadata !"i", metadata !1, i32 15, metadata !5} ; [ DW_TAG_arg_variable ]
219!33 = metadata !{i32 15, i32 12, metadata !9, null}
220!34 = metadata !{i32 15, i32 17, metadata !35, null}
221!35 = metadata !{i32 524299, metadata !9, i32 15, i32 15, metadata !1, i32 4} ; [ DW_TAG_lexical_block ]
222!36 = metadata !{i32 524545, metadata !10, metadata !"i", metadata !1, i32 16, metadata !5} ; [ DW_TAG_arg_variable ]
223!37 = metadata !{i32 16, i32 12, metadata !10, null}
224!38 = metadata !{i32 16, i32 17, metadata !39, null}
225!39 = metadata !{i32 524299, metadata !10, i32 16, i32 15, metadata !1, i32 5} ; [ DW_TAG_lexical_block ]
226!40 = metadata !{i32 524545, metadata !11, metadata !"i", metadata !1, i32 17, metadata !41} ; [ DW_TAG_arg_variable ]
227!41 = metadata !{i32 524307, metadata !1, metadata !"XYZ", metadata !1, i32 2, i64 160, i64 32, i64 0, i32 0, null, metadata !42, i32 0, null} ; [ DW_TAG_structure_type ]
228!42 = metadata !{metadata !43, metadata !44, metadata !45, metadata !46, metadata !47}
229!43 = metadata !{i32 524301, metadata !1, metadata !"x", metadata !1, i32 3, i64 32, i64 32, i64 0, i32 0, metadata !5} ; [ DW_TAG_member ]
230!44 = metadata !{i32 524301, metadata !1, metadata !"y", metadata !1, i32 4, i64 32, i64 32, i64 32, i32 0, metadata !5} ; [ DW_TAG_member ]
231!45 = metadata !{i32 524301, metadata !1, metadata !"z", metadata !1, i32 5, i64 32, i64 32, i64 64, i32 0, metadata !5} ; [ DW_TAG_member ]
232!46 = metadata !{i32 524301, metadata !1, metadata !"a", metadata !1, i32 6, i64 32, i64 32, i64 96, i32 0, metadata !5} ; [ DW_TAG_member ]
233!47 = metadata !{i32 524301, metadata !1, metadata !"b", metadata !1, i32 7, i64 32, i64 32, i64 128, i32 0, metadata !5} ; [ DW_TAG_member ]
234!48 = metadata !{i32 17, i32 19, metadata !11, null}
235!49 = metadata !{i32 17, i32 24, metadata !50, null}
236!50 = metadata !{i32 524299, metadata !11, i32 17, i32 22, metadata !1, i32 6} ; [ DW_TAG_lexical_block ]
237!51 = metadata !{i32 524545, metadata !12, metadata !"i", metadata !1, i32 18, metadata !41} ; [ DW_TAG_arg_variable ]
238!52 = metadata !{i32 18, i32 19, metadata !12, null}
239!53 = metadata !{i32 18, i32 24, metadata !54, null}
240!54 = metadata !{i32 524299, metadata !12, i32 18, i32 22, metadata !1, i32 7} ; [ DW_TAG_lexical_block ]
241!55 = metadata !{i32 524545, metadata !13, metadata !"i", metadata !1, i32 19, metadata !41} ; [ DW_TAG_arg_variable ]
242!56 = metadata !{i32 19, i32 19, metadata !13, null}
243!57 = metadata !{i32 19, i32 24, metadata !58, null}
244!58 = metadata !{i32 524299, metadata !13, i32 19, i32 22, metadata !1, i32 8} ; [ DW_TAG_lexical_block ]
245!59 = metadata !{i32 524545, metadata !14, metadata !"i", metadata !1, i32 20, metadata !41} ; [ DW_TAG_arg_variable ]
246!60 = metadata !{i32 20, i32 20, metadata !14, null}
247!61 = metadata !{i32 20, i32 25, metadata !62, null}
248!62 = metadata !{i32 524299, metadata !14, i32 20, i32 23, metadata !1, i32 9} ; [ DW_TAG_lexical_block ]
249!63 = metadata !{i32 24, i32 3, metadata !64, null}
250!64 = metadata !{i32 524299, metadata !15, i32 23, i32 12, metadata !1, i32 10} ; [ DW_TAG_lexical_block ]
251!65 = metadata !{i32 25, i32 3, metadata !64, null}
252!66 = metadata !{i32 26, i32 3, metadata !64, null}
253!67 = metadata !{i32 27, i32 3, metadata !64, null}
254!68 = metadata !{i32 28, i32 3, metadata !64, null}
255!69 = metadata !{i32 29, i32 3, metadata !64, null}
256!70 = metadata !{i32 524544, metadata !64, metadata !"abc", metadata !1, i32 30, metadata !41} ; [ DW_TAG_auto_variable ]
257!71 = metadata !{i32 30, i32 14, metadata !64, null}
258!72 = metadata !{i32 30, i32 17, metadata !64, null}
259!73 = metadata !{i32 31, i32 3, metadata !64, null}
260!74 = metadata !{i32 32, i32 3, metadata !64, null}
261!75 = metadata !{i32 33, i32 3, metadata !64, null}
262!76 = metadata !{i32 34, i32 3, metadata !64, null}
263!77 = metadata !{i32 36, i32 3, metadata !64, null}