65fd494aeed6ece3da1ec3ce5a7a6fc91585e508
[oota-llvm.git] / test / DebugInfo / X86 / nophysreg.ll
1 ; RUN: llc -filetype=obj < %s | llvm-dwarfdump -debug-dump=info - | FileCheck %s
2 ;
3 ; PR22296: In this testcase the DBG_VALUE describing "p5" becomes unavailable
4 ; because the register its address is in is clobbered and we (currently) aren't
5 ; smart enough to realize that the value is rematerialized immediately after the
6 ; DBG_VALUE and/or is actually a stack slot.
7 ;
8 ; Test that we handle this situation gracefully by omitting the DW_AT_location
9 ; and not asserting.
10 ; Note that this check may XPASS in the future if DbgValueHistoryCalculator
11 ; becoms smarter. That would be fine, too.
12 ;
13 ; CHECK: DW_TAG_subprogram
14 ; CHECK: linkage_name{{.*}}_Z2f21A
15 ; CHECK: DW_TAG_formal_parameter
16 ; CHECK-NOT: DW_AT_location
17 ; CHECK-NEXT: DW_AT_name {{.*}}"p5"
18 ;
19 ; // Compile at -O1
20 ; struct A {
21 ;   int *m1;
22 ;   int m2;
23 ; };
24 ;
25 ; void f1(int *p1, int p2);
26 ; void __attribute__((always_inline)) f2(A p5) { f1(p5.m1, p5.m2); }
27 ;
28 ; void func(void*);
29 ; void func(const int &, const int&);
30 ; int cond();
31 ; void f() {
32 ;   while (cond()) {
33 ;     int x;
34 ;     func(x, 0);
35 ;     while (cond()) {
36 ;       char y;
37 ;       func(&y);
38 ;       char j;
39 ;       func(&j);
40 ;       char I;
41 ;       func(&I);
42 ;       func(0, 0);
43 ;       A g;
44 ;       g.m1 = &x;
45 ;       f2(g);
46 ;     }
47 ;   }
48 ; }
49 ; ModuleID = 'test.cpp'
50 target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
51 target triple = "x86_64-apple-macosx10.10.0"
52
53 %struct.A = type { i32*, i32 }
54
55 ; Function Attrs: alwaysinline ssp uwtable
56 define void @_Z2f21A(i32* %p5.coerce0, i32 %p5.coerce1) #0 {
57 entry:
58   tail call void @llvm.dbg.value(metadata i32* %p5.coerce0, i64 0, metadata !16, metadata !33), !dbg !34
59   tail call void @llvm.dbg.value(metadata i32 %p5.coerce1, i64 0, metadata !16, metadata !35), !dbg !34
60   tail call void @llvm.dbg.declare(metadata %struct.A* undef, metadata !16, metadata !36), !dbg !34
61   tail call void @_Z2f1Pii(i32* %p5.coerce0, i32 %p5.coerce1), !dbg !37
62   ret void, !dbg !38
63 }
64
65 ; Function Attrs: nounwind readnone
66 declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
67
68 declare void @_Z2f1Pii(i32*, i32) #2
69
70 ; Function Attrs: ssp uwtable
71 define void @_Z1fv() #3 {
72 entry:
73   %x = alloca i32, align 4
74   %ref.tmp = alloca i32, align 4
75   %y = alloca i8, align 1
76   %j = alloca i8, align 1
77   %I = alloca i8, align 1
78   %ref.tmp5 = alloca i32, align 4
79   %ref.tmp6 = alloca i32, align 4
80   %call11 = call i32 @_Z4condv(), !dbg !39
81   %tobool12 = icmp eq i32 %call11, 0, !dbg !39
82   br i1 %tobool12, label %while.end7, label %while.body, !dbg !40
83
84 while.cond.loopexit:                              ; preds = %while.body4, %while.body
85   %call = call i32 @_Z4condv(), !dbg !39
86   %tobool = icmp eq i32 %call, 0, !dbg !39
87   br i1 %tobool, label %while.end7, label %while.body, !dbg !40
88
89 while.body:                                       ; preds = %entry, %while.cond.loopexit
90   store i32 0, i32* %ref.tmp, align 4, !dbg !41, !tbaa !42
91   call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !21, metadata !36), !dbg !46
92   call void @_Z4funcRKiS0_(i32* dereferenceable(4) %x, i32* dereferenceable(4) %ref.tmp), !dbg !47
93   %call29 = call i32 @_Z4condv(), !dbg !48
94   %tobool310 = icmp eq i32 %call29, 0, !dbg !48
95   br i1 %tobool310, label %while.cond.loopexit, label %while.body4, !dbg !49
96
97 while.body4:                                      ; preds = %while.body, %while.body4
98   call void @llvm.dbg.value(metadata i8* %y, i64 0, metadata !23, metadata !36), !dbg !50
99   call void @_Z4funcPv(i8* %y), !dbg !51
100   call void @llvm.dbg.value(metadata i8* %j, i64 0, metadata !26, metadata !36), !dbg !52
101   call void @_Z4funcPv(i8* %j), !dbg !53
102   call void @llvm.dbg.value(metadata i8* %I, i64 0, metadata !27, metadata !36), !dbg !54
103   call void @_Z4funcPv(i8* %I), !dbg !55
104   store i32 0, i32* %ref.tmp5, align 4, !dbg !56, !tbaa !42
105   store i32 0, i32* %ref.tmp6, align 4, !dbg !57, !tbaa !42
106   call void @_Z4funcRKiS0_(i32* dereferenceable(4) %ref.tmp5, i32* dereferenceable(4) %ref.tmp6), !dbg !58
107   call void @llvm.dbg.declare(metadata %struct.A* undef, metadata !28, metadata !36), !dbg !59
108   call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !28, metadata !33), !dbg !59
109   call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !21, metadata !36), !dbg !46
110   call void @llvm.dbg.value(metadata i32* %x, i64 0, metadata !60, metadata !33), !dbg !62
111   call void @llvm.dbg.value(metadata i32 undef, i64 0, metadata !60, metadata !35), !dbg !62
112   call void @llvm.dbg.declare(metadata %struct.A* undef, metadata !60, metadata !36), !dbg !62
113   call void @_Z2f1Pii(i32* %x, i32 undef), !dbg !63
114   %call2 = call i32 @_Z4condv(), !dbg !48
115   %tobool3 = icmp eq i32 %call2, 0, !dbg !48
116   br i1 %tobool3, label %while.cond.loopexit, label %while.body4, !dbg !49
117
118 while.end7:                                       ; preds = %while.cond.loopexit, %entry
119   ret void, !dbg !64
120 }
121
122 declare i32 @_Z4condv()
123
124 declare void @_Z4funcRKiS0_(i32* dereferenceable(4), i32* dereferenceable(4))
125
126 declare void @_Z4funcPv(i8*)
127
128 ; Function Attrs: nounwind readnone
129 declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #1
130
131 attributes #0 = { alwaysinline ssp uwtable }
132 attributes #1 = { nounwind readnone }
133 attributes #3 = { ssp uwtable }
134
135 !llvm.dbg.cu = !{!0}
136 !llvm.module.flags = !{!29, !30, !31}
137 !llvm.ident = !{!32}
138
139 !0 = !MDCompileUnit(language: DW_LANG_C_plus_plus, producer: "clang version 3.7.0 (trunk 227088) (llvm/trunk 227091)", isOptimized: true, emissionKind: 1, file: !1, enums: !2, retainedTypes: !3, subprograms: !10, globals: !2, imports: !2)
140 !1 = !MDFile(filename: "test.cpp", directory: "")
141 !2 = !{}
142 !3 = !{!4}
143 !4 = !MDCompositeType(tag: DW_TAG_structure_type, name: "A", line: 1, size: 128, align: 64, file: !1, elements: !5, identifier: "_ZTS1A")
144 !5 = !{!6, !9}
145 !6 = !MDDerivedType(tag: DW_TAG_member, name: "m1", line: 2, size: 64, align: 64, file: !1, scope: !"_ZTS1A", baseType: !7)
146 !7 = !MDDerivedType(tag: DW_TAG_pointer_type, size: 64, align: 64, baseType: !8)
147 !8 = !MDBasicType(tag: DW_TAG_base_type, name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
148 !9 = !MDDerivedType(tag: DW_TAG_member, name: "m2", line: 3, size: 32, align: 32, offset: 64, file: !1, scope: !"_ZTS1A", baseType: !8)
149 !10 = !{!11, !17}
150 !11 = !MDSubprogram(name: "f2", linkageName: "_Z2f21A", line: 7, isLocal: false, isDefinition: true, flags: DIFlagPrototyped, isOptimized: true, scopeLine: 7, file: !1, scope: !12, type: !13, function: void (i32*, i32)* @_Z2f21A, variables: !15)
151 !12 = !MDFile(filename: "test.cpp", directory: "")
152 !13 = !MDSubroutineType(types: !14)
153 !14 = !{null, !"_ZTS1A"}
154 !15 = !{!16}
155 !16 = !MDLocalVariable(tag: DW_TAG_arg_variable, name: "p5", line: 7, arg: 1, scope: !11, file: !12, type: !"_ZTS1A")
156 !17 = !MDSubprogram(name: "f", linkageName: "_Z1fv", line: 12, isLocal: false, isDefinition: true, flags: DIFlagPrototyped, isOptimized: true, scopeLine: 12, file: !1, scope: !12, type: !18, function: void ()* @_Z1fv, variables: !20)
157 !18 = !MDSubroutineType(types: !19)
158 !19 = !{null}
159 !20 = !{!21, !23, !26, !27, !28}
160 !21 = !MDLocalVariable(tag: DW_TAG_auto_variable, name: "x", line: 14, scope: !22, file: !12, type: !8)
161 !22 = distinct !MDLexicalBlock(line: 13, column: 18, file: !1, scope: !17)
162 !23 = !MDLocalVariable(tag: DW_TAG_auto_variable, name: "y", line: 17, scope: !24, file: !12, type: !25)
163 !24 = distinct !MDLexicalBlock(line: 16, column: 20, file: !1, scope: !22)
164 !25 = !MDBasicType(tag: DW_TAG_base_type, name: "char", size: 8, align: 8, encoding: DW_ATE_signed_char)
165 !26 = !MDLocalVariable(tag: DW_TAG_auto_variable, name: "j", line: 19, scope: !24, file: !12, type: !25)
166 !27 = !MDLocalVariable(tag: DW_TAG_auto_variable, name: "I", line: 21, scope: !24, file: !12, type: !25)
167 !28 = !MDLocalVariable(tag: DW_TAG_auto_variable, name: "g", line: 24, scope: !24, file: !12, type: !"_ZTS1A")
168 !29 = !{i32 2, !"Dwarf Version", i32 2}
169 !30 = !{i32 2, !"Debug Info Version", i32 3}
170 !31 = !{i32 1, !"PIC Level", i32 2}
171 !32 = !{!"clang version 3.7.0 (trunk 227088) (llvm/trunk 227091)"}
172 !33 = !MDExpression(DW_OP_bit_piece, 0, 8)
173 !34 = !MDLocation(line: 7, column: 42, scope: !11)
174 !35 = !MDExpression(DW_OP_bit_piece, 8, 4)
175 !36 = !MDExpression()
176 !37 = !MDLocation(line: 7, column: 48, scope: !11)
177 !38 = !MDLocation(line: 7, column: 66, scope: !11)
178 !39 = !MDLocation(line: 13, column: 10, scope: !17)
179 !40 = !MDLocation(line: 13, column: 3, scope: !17)
180 !41 = !MDLocation(line: 15, column: 13, scope: !22)
181 !42 = !{!43, !43, i64 0}
182 !43 = !{!"int", !44, i64 0}
183 !44 = !{!"omnipotent char", !45, i64 0}
184 !45 = !{!"Simple C/C++ TBAA"}
185 !46 = !MDLocation(line: 14, column: 9, scope: !22)
186 !47 = !MDLocation(line: 15, column: 5, scope: !22)
187 !48 = !MDLocation(line: 16, column: 12, scope: !22)
188 !49 = !MDLocation(line: 16, column: 5, scope: !22)
189 !50 = !MDLocation(line: 17, column: 12, scope: !24)
190 !51 = !MDLocation(line: 18, column: 7, scope: !24)
191 !52 = !MDLocation(line: 19, column: 12, scope: !24)
192 !53 = !MDLocation(line: 20, column: 7, scope: !24)
193 !54 = !MDLocation(line: 21, column: 12, scope: !24)
194 !55 = !MDLocation(line: 22, column: 7, scope: !24)
195 !56 = !MDLocation(line: 23, column: 12, scope: !24)
196 !57 = !MDLocation(line: 23, column: 15, scope: !24)
197 !58 = !MDLocation(line: 23, column: 7, scope: !24)
198 !59 = !MDLocation(line: 24, column: 9, scope: !24)
199 !60 = !MDLocalVariable(tag: DW_TAG_arg_variable, name: "p5", line: 7, arg: 1, scope: !11, file: !12, type: !"_ZTS1A", inlinedAt: !61)
200 !61 = distinct !MDLocation(line: 26, column: 7, scope: !24)
201 !62 = !MDLocation(line: 7, column: 42, scope: !11, inlinedAt: !61)
202 !63 = !MDLocation(line: 7, column: 48, scope: !11, inlinedAt: !61)
203 !64 = !MDLocation(line: 29, column: 1, scope: !17)