4565c35b6ff2966d57e74b51117c6f514a4fb3d0
[oota-llvm.git] / test / CodeGen / X86 / dbg-declare-hybrid.ll
1 ; This test case checks handling of llvm.dbg.declare intrinsic during hybrid mode where we begin
2 ; using fast-isel but switch back to DAG building at some point.
3 ; RUN: llc  -mtriple=x86_64-apple-darwin --disable-fp-elim -O0  %s -o %t.s
4 ; RUN: %compile_c -m64 %t.s -o %t.o
5 ; RUN: %link -m64 %t.o -o %t.exe
6 ; RUN: echo {break f1\n break f4\n break f5\n run \n p i\n c \n p i\n c \n p i\n} > %t.in
7 ; RUN: gdb -q -batch -n -x %t.in %t.exe >& %t.out
8 ; RUN: grep "1 = 42" %t.out
9 ; RUN: grep "2 = 45" %t.out
10 ; RUN: grep "3 = 46" %t.out
11
12 ; XTARGET: darwin
13 target triple = "x86_64-apple-darwin"
14 %struct.XYZ = type { i32, i32, i32, i32, i32 }
15 %0 = type { i64, i32 }
16 define %0 @foobar() {
17   ret i64 6, i32 7
18 }
19
20 ; Check handling of llvm.dbg.declare for an argument referred through alloca, where
21 ; alloca dominates llvm.dbg.declare
22 define i32 @f1(i32 %i) nounwind ssp {
23 entry:
24   %i.addr = alloca i32, align 4
25   store i32 %i, i32* %i.addr, align 4
26   %call = call %0 @foobar()
27   call void @llvm.dbg.declare(metadata !{i32* %i.addr}, metadata !16), !dbg !17
28   %call2 = call %0 @foobar()
29   %tmp = load i32* %i.addr, align 4, !dbg !18
30   ret i32 %tmp, !dbg !18
31 }
32
33 declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
34
35 ; Check handling of llvm.dbg.declare for an argument referred through alloca, where
36 ; llvm.dbg.declare dominates alloca.
37 define i32 @f2(i32 %i) nounwind ssp {
38 entry:
39   %call = call %0 @foobar()
40   call void @llvm.dbg.declare(metadata !{i32* %i.addr}, metadata !20), !dbg !21
41   %call2 = call %0 @foobar()
42   %i.addr = alloca i32, align 4
43   store i32 %i, i32* %i.addr, align 4
44   %tmp = load i32* %i.addr, align 4, !dbg !22
45   ret i32 %tmp, !dbg !22
46 }
47
48 ; Check handling of an argument referred directly by llvm.dbg.declare where at least
49 ; one argument use dominates llvm.dbg.declare.
50 define i32 @f3(i32 %i) nounwind ssp {
51 entry:
52   %i.addr = alloca i32, align 4
53   store i32 %i, i32* %i.addr, align 4
54   %call = call %0 @foobar()
55   call void @llvm.dbg.declare(metadata !{i32 %i}, metadata !24), !dbg !2
56   %call2 = call %0 @foobar()
57   %tmp = load i32* %i.addr, align 4, !dbg !26
58   ret i32 %tmp, !dbg !26
59 }
60
61 ; Check handling of an argument referred directly by llvm.dbg.declare where 
62 ; llvm.dbg.declare dominates all uses of argument.
63 define i32 @f4(i32 %i) nounwind ssp {
64 entry:
65   %call = call %0 @foobar()
66   call void @llvm.dbg.declare(metadata !{i32 %i}, metadata !28), !dbg !29
67   %call2 = call %0 @foobar()
68   ret i32 %i, !dbg !30
69 }
70
71 ; Check handling of an argument referred directly by llvm.dbg.declare where 
72 ; llvm.dbg.declare dominates all uses of argument in separate basic block.
73 define i32 @f5(i32 %i) nounwind ssp {
74 entry:
75   %call = call %0 @foobar()
76   call void @llvm.dbg.declare(metadata !{i32 %i}, metadata !32), !dbg !33
77   %call2 = call %0 @foobar()
78   br label %bbr
79 bbr:
80   ret i32 %i, !dbg !34
81 }
82
83 ; Check handling of an argument referred directly by llvm.dbg.declare where 
84 ; argument is not used.
85 define i32 @f6(i32 %i) nounwind ssp {
86 entry:
87   %call = call %0 @foobar()
88   call void @llvm.dbg.declare(metadata !{i32 %i}, metadata !36), !dbg !37
89   %call2 = call %0 @foobar()
90   ret i32 1, !dbg !38
91 }
92
93 ; Check handling of an byval argument referred directly by llvm.dbg.declare where 
94 ; argument is not used.
95 define i32 @f7(%struct.XYZ* byval %i) nounwind ssp {
96 entry:
97   %call = call %0 @foobar()
98   call void @llvm.dbg.declare(metadata !{%struct.XYZ* %i}, metadata !40), !dbg !48
99   %call2 = call %0 @foobar()
100   ret i32 1, !dbg !49
101 }
102
103 ; Check handling of an byval argument referred directly by llvm.dbg.declare where 
104 ; argument use dominates llvm.dbg.declare.
105 define i32 @f8(%struct.XYZ* byval %i) nounwind ssp {
106 entry:
107   %tmp = getelementptr inbounds %struct.XYZ* %i, i32 0, i32 1, !dbg !53
108   %tmp1 = load i32* %tmp, align 4, !dbg !53
109   %call = call %0 @foobar()
110   call void @llvm.dbg.declare(metadata !{%struct.XYZ* %i}, metadata !51), !dbg !52
111   %call2 = call %0 @foobar()
112   ret i32 %tmp1, !dbg !53
113 }
114
115 ; Check handling of an byval argument referred directly by llvm.dbg.declare where 
116 ; llvm.dbg.declare dominates all uses of argument.
117 define i32 @f9(%struct.XYZ* byval %i) nounwind ssp {
118 entry:
119   %call = call %0 @foobar()
120   call void @llvm.dbg.declare(metadata !{%struct.XYZ* %i}, metadata !55), !dbg !56
121   %call2 = call %0 @foobar()
122   %tmp = getelementptr inbounds %struct.XYZ* %i, i32 0, i32 2, !dbg !57
123   %tmp1 = load i32* %tmp, align 4, !dbg !57
124   ret i32 %tmp1, !dbg !57
125 }
126
127 ; Check handling of an byval argument referred directly by llvm.dbg.declare where 
128 ; llvm.dbg.declare dominates all uses of argument in separate basic block.
129 define i32 @f10(%struct.XYZ* byval %i) nounwind ssp {
130 entry:
131   %call = call %0 @foobar()
132   call void @llvm.dbg.declare(metadata !{%struct.XYZ* %i}, metadata !59), !dbg !60
133   %call2 = call %0 @foobar()
134   br label %bbr
135 bbr:
136   %tmp = getelementptr inbounds %struct.XYZ* %i, i32 0, i32 3, !dbg !61
137   %tmp1 = load i32* %tmp, align 4, !dbg !61
138   ret i32 %tmp1, !dbg !61
139 }
140
141 define i32 @main() nounwind ssp {
142 entry:
143   %retval = alloca i32, align 4
144   %abc = alloca %struct.XYZ, align 4
145   %agg.tmp = alloca %struct.XYZ, align 4
146   %agg.tmp13 = alloca %struct.XYZ, align 4
147   %agg.tmp17 = alloca %struct.XYZ, align 4
148   %agg.tmp21 = alloca %struct.XYZ, align 4
149   store i32 0, i32* %retval
150   %call = call i32 @f1(i32 42), !dbg !63
151   %call1 = call i32 @f2(i32 43), !dbg !65
152   %call2 = call i32 @f3(i32 44), !dbg !66
153   %call3 = call i32 @f4(i32 45), !dbg !67
154   %call4 = call i32 @f5(i32 46), !dbg !68
155   %call5 = call i32 @f6(i32 47), !dbg !69
156   call void @llvm.dbg.declare(metadata !{%struct.XYZ* %abc}, metadata !70), !dbg !71
157   %tmp = getelementptr inbounds %struct.XYZ* %abc, i32 0, i32 0, !dbg !72
158   store i32 51, i32* %tmp, align 4, !dbg !72
159   %tmp6 = getelementptr inbounds %struct.XYZ* %abc, i32 0, i32 1, !dbg !72
160   store i32 52, i32* %tmp6, align 4, !dbg !72
161   %tmp7 = getelementptr inbounds %struct.XYZ* %abc, i32 0, i32 2, !dbg !72
162   store i32 53, i32* %tmp7, align 4, !dbg !72
163   %tmp8 = getelementptr inbounds %struct.XYZ* %abc, i32 0, i32 3, !dbg !72
164   store i32 54, i32* %tmp8, align 4, !dbg !72
165   %tmp9 = getelementptr inbounds %struct.XYZ* %abc, i32 0, i32 4, !dbg !72
166   store i32 55, i32* %tmp9, align 4, !dbg !72
167   %tmp10 = bitcast %struct.XYZ* %agg.tmp to i8*, !dbg !73
168   %tmp11 = bitcast %struct.XYZ* %abc to i8*, !dbg !73
169   call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp10, i8* %tmp11, i64 20, i32 4, i1 false), !dbg !73
170   %call12 = call i32 @f7(%struct.XYZ* byval %agg.tmp), !dbg !73
171   %tmp14 = bitcast %struct.XYZ* %agg.tmp13 to i8*, !dbg !74
172   %tmp15 = bitcast %struct.XYZ* %abc to i8*, !dbg !74
173   call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp14, i8* %tmp15, i64 20, i32 4, i1 false), !dbg !74
174   %call16 = call i32 @f8(%struct.XYZ* byval %agg.tmp13), !dbg !74
175   %tmp18 = bitcast %struct.XYZ* %agg.tmp17 to i8*, !dbg !75
176   %tmp19 = bitcast %struct.XYZ* %abc to i8*, !dbg !75
177   call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp18, i8* %tmp19, i64 20, i32 4, i1 false), !dbg !75
178   %call20 = call i32 @f9(%struct.XYZ* byval %agg.tmp17), !dbg !75
179   %tmp22 = bitcast %struct.XYZ* %agg.tmp21 to i8*, !dbg !76
180   %tmp23 = bitcast %struct.XYZ* %abc to i8*, !dbg !76
181   call void @llvm.memcpy.p0i8.p0i8.i64(i8* %tmp22, i8* %tmp23, i64 20, i32 4, i1 false), !dbg !76
182   %call24 = call i32 @f10(%struct.XYZ* byval %agg.tmp21), !dbg !76
183   ret i32 0, !dbg !77
184 }
185
186 declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind
187
188 !llvm.dbg.sp = !{!0, !6, !7, !8, !9, !10, !11, !12, !13, !14, !15}
189
190 !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 ]
191 !1 = metadata !{i32 524329, metadata !"arg.c", metadata !"/private/tmp", metadata !2} ; [ DW_TAG_file_type ]
192 !2 = metadata !{i32 524305, i32 0, i32 12, metadata !"arg.c", metadata !"/private/tmp", metadata !"clang version 2.8 (trunk 112967)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ]
193 !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 ]
194 !4 = metadata !{metadata !5}
195 !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 ]
196 !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 ]
197 !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 ]
198 !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 ]
199 !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 ]
200 !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 ]
201 !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 ]
202 !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 ]
203 !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 ]
204 !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 ]
205 !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 ]
206 !16 = metadata !{i32 524545, metadata !0, metadata !"i", metadata !1, i32 11, metadata !5} ; [ DW_TAG_arg_variable ]
207 !17 = metadata !{i32 11, i32 12, metadata !0, null}
208 !18 = metadata !{i32 11, i32 17, metadata !19, null}
209 !19 = metadata !{i32 524299, metadata !0, i32 11, i32 15, metadata !1, i32 0} ; [ DW_TAG_lexical_block ]
210 !20 = metadata !{i32 524545, metadata !6, metadata !"i", metadata !1, i32 12, metadata !5} ; [ DW_TAG_arg_variable ]
211 !21 = metadata !{i32 12, i32 12, metadata !6, null}
212 !22 = metadata !{i32 12, i32 17, metadata !23, null}
213 !23 = metadata !{i32 524299, metadata !6, i32 12, i32 15, metadata !1, i32 1} ; [ DW_TAG_lexical_block ]
214 !24 = metadata !{i32 524545, metadata !7, metadata !"i", metadata !1, i32 13, metadata !5} ; [ DW_TAG_arg_variable ]
215 !25 = metadata !{i32 13, i32 12, metadata !7, null}
216 !26 = metadata !{i32 13, i32 17, metadata !27, null}
217 !27 = metadata !{i32 524299, metadata !7, i32 13, i32 15, metadata !1, i32 2} ; [ DW_TAG_lexical_block ]
218 !28 = metadata !{i32 524545, metadata !8, metadata !"i", metadata !1, i32 14, metadata !5} ; [ DW_TAG_arg_variable ]
219 !29 = metadata !{i32 14, i32 12, metadata !8, null}
220 !30 = metadata !{i32 14, i32 17, metadata !31, null}
221 !31 = metadata !{i32 524299, metadata !8, i32 14, i32 15, metadata !1, i32 3} ; [ DW_TAG_lexical_block ]
222 !32 = metadata !{i32 524545, metadata !9, metadata !"i", metadata !1, i32 15, metadata !5} ; [ DW_TAG_arg_variable ]
223 !33 = metadata !{i32 15, i32 12, metadata !9, null}
224 !34 = metadata !{i32 15, i32 17, metadata !35, null}
225 !35 = metadata !{i32 524299, metadata !9, i32 15, i32 15, metadata !1, i32 4} ; [ DW_TAG_lexical_block ]
226 !36 = metadata !{i32 524545, metadata !10, metadata !"i", metadata !1, i32 16, metadata !5} ; [ DW_TAG_arg_variable ]
227 !37 = metadata !{i32 16, i32 12, metadata !10, null}
228 !38 = metadata !{i32 16, i32 17, metadata !39, null}
229 !39 = metadata !{i32 524299, metadata !10, i32 16, i32 15, metadata !1, i32 5} ; [ DW_TAG_lexical_block ]
230 !40 = metadata !{i32 524545, metadata !11, metadata !"i", metadata !1, i32 17, metadata !41} ; [ DW_TAG_arg_variable ]
231 !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 ]
232 !42 = metadata !{metadata !43, metadata !44, metadata !45, metadata !46, metadata !47}
233 !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 ]
234 !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 ]
235 !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 ]
236 !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 ]
237 !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 ]
238 !48 = metadata !{i32 17, i32 19, metadata !11, null}
239 !49 = metadata !{i32 17, i32 24, metadata !50, null}
240 !50 = metadata !{i32 524299, metadata !11, i32 17, i32 22, metadata !1, i32 6} ; [ DW_TAG_lexical_block ]
241 !51 = metadata !{i32 524545, metadata !12, metadata !"i", metadata !1, i32 18, metadata !41} ; [ DW_TAG_arg_variable ]
242 !52 = metadata !{i32 18, i32 19, metadata !12, null}
243 !53 = metadata !{i32 18, i32 24, metadata !54, null}
244 !54 = metadata !{i32 524299, metadata !12, i32 18, i32 22, metadata !1, i32 7} ; [ DW_TAG_lexical_block ]
245 !55 = metadata !{i32 524545, metadata !13, metadata !"i", metadata !1, i32 19, metadata !41} ; [ DW_TAG_arg_variable ]
246 !56 = metadata !{i32 19, i32 19, metadata !13, null}
247 !57 = metadata !{i32 19, i32 24, metadata !58, null}
248 !58 = metadata !{i32 524299, metadata !13, i32 19, i32 22, metadata !1, i32 8} ; [ DW_TAG_lexical_block ]
249 !59 = metadata !{i32 524545, metadata !14, metadata !"i", metadata !1, i32 20, metadata !41} ; [ DW_TAG_arg_variable ]
250 !60 = metadata !{i32 20, i32 20, metadata !14, null}
251 !61 = metadata !{i32 20, i32 25, metadata !62, null}
252 !62 = metadata !{i32 524299, metadata !14, i32 20, i32 23, metadata !1, i32 9} ; [ DW_TAG_lexical_block ]
253 !63 = metadata !{i32 24, i32 3, metadata !64, null}
254 !64 = metadata !{i32 524299, metadata !15, i32 23, i32 12, metadata !1, i32 10} ; [ DW_TAG_lexical_block ]
255 !65 = metadata !{i32 25, i32 3, metadata !64, null}
256 !66 = metadata !{i32 26, i32 3, metadata !64, null}
257 !67 = metadata !{i32 27, i32 3, metadata !64, null}
258 !68 = metadata !{i32 28, i32 3, metadata !64, null}
259 !69 = metadata !{i32 29, i32 3, metadata !64, null}
260 !70 = metadata !{i32 524544, metadata !64, metadata !"abc", metadata !1, i32 30, metadata !41} ; [ DW_TAG_auto_variable ]
261 !71 = metadata !{i32 30, i32 14, metadata !64, null}
262 !72 = metadata !{i32 30, i32 17, metadata !64, null}
263 !73 = metadata !{i32 31, i32 3, metadata !64, null}
264 !74 = metadata !{i32 32, i32 3, metadata !64, null}
265 !75 = metadata !{i32 33, i32 3, metadata !64, null}
266 !76 = metadata !{i32 34, i32 3, metadata !64, null}
267 !77 = metadata !{i32 36, i32 3, metadata !64, null}