1 // RUN: %clang_cc1 -triple x86_64-gnu-linux -O3 -disable-llvm-passes -I%S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,LIN,NoNewStructPathTBAA
2 // RUN: %clang_cc1 -triple x86_64-gnu-linux -O3 -disable-llvm-passes -I%S -new-struct-path-tbaa -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,LIN,NewStructPathTBAA
3
4 // RUN: %clang_cc1 -triple x86_64-windows-pc -O3 -disable-llvm-passes -I%S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,WIN,NoNewStructPathTBAA
5 // RUN: %clang_cc1 -triple x86_64-windows-pc -O3 -disable-llvm-passes -I%S -new-struct-path-tbaa -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,WIN,NewStructPathTBAA
6
7 #include <typeinfo>
8
9 // Ensure that the layout for these structs is the same as the normal bitfield
10 // layouts.
11 struct BitFieldsByte {
12 _ExtInt(7) A : 3;
13 _ExtInt(7) B : 3;
14 _ExtInt(7) C : 2;
15 };
16 // CHECK: %struct.BitFieldsByte = type { i8 }
17
18 struct BitFieldsShort {
19 _ExtInt(15) A : 3;
20 _ExtInt(15) B : 3;
21 _ExtInt(15) C : 2;
22 };
23 // LIN: %struct.BitFieldsShort = type { i8, i8 }
24 // WIN: %struct.BitFieldsShort = type { i16 }
25
26 struct BitFieldsInt {
27 _ExtInt(31) A : 3;
28 _ExtInt(31) B : 3;
29 _ExtInt(31) C : 2;
30 };
31 // LIN: %struct.BitFieldsInt = type { i8, [3 x i8] }
32 // WIN: %struct.BitFieldsInt = type { i32 }
33
34 struct BitFieldsLong {
35 _ExtInt(63) A : 3;
36 _ExtInt(63) B : 3;
37 _ExtInt(63) C : 2;
38 };
39 // LIN: %struct.BitFieldsLong = type { i8, [7 x i8] }
40 // WIN: %struct.BitFieldsLong = type { i64 }
41
42 struct HasExtIntFirst {
43 _ExtInt(35) A;
44 int B;
45 };
46 // CHECK: %struct.HasExtIntFirst = type { i35, i32 }
47
48 struct HasExtIntLast {
49 int A;
50 _ExtInt(35) B;
51 };
52 // CHECK: %struct.HasExtIntLast = type { i32, i35 }
53
54 struct HasExtIntMiddle {
55 int A;
56 _ExtInt(35) B;
57 int C;
58 };
59 // CHECK: %struct.HasExtIntMiddle = type { i32, i35, i32 }
60
61 // Force emitting of the above structs.
StructEmit()62 void StructEmit() {
63 BitFieldsByte A;
64 BitFieldsShort B;
65 BitFieldsInt C;
66 BitFieldsLong D;
67
68 HasExtIntFirst E;
69 HasExtIntLast F;
70 HasExtIntMiddle G;
71 }
72
BitfieldAssignment()73 void BitfieldAssignment() {
74 // LIN: define{{.*}} void @_Z18BitfieldAssignmentv
75 // WIN: define dso_local void @"?BitfieldAssignment@@YAXXZ"
76 BitFieldsByte B;
77 B.A = 3;
78 B.B = 2;
79 B.C = 1;
80 // First one is used for the lifetime start, skip that.
81 // CHECK: bitcast %struct.BitFieldsByte*
82 // CHECK: %[[BFType:.+]] = bitcast %struct.BitFieldsByte*
83 // CHECK: %[[LOADA:.+]] = load i8, i8* %[[BFType]]
84 // CHECK: %[[CLEARA:.+]] = and i8 %[[LOADA]], -8
85 // CHECK: %[[SETA:.+]] = or i8 %[[CLEARA]], 3
86 // CHECK: %[[BFType:.+]] = bitcast %struct.BitFieldsByte*
87 // CHECK: %[[LOADB:.+]] = load i8, i8* %[[BFType]]
88 // CHECK: %[[CLEARB:.+]] = and i8 %[[LOADB]], -57
89 // CHECK: %[[SETB:.+]] = or i8 %[[CLEARB]], 16
90 // CHECK: %[[BFType:.+]] = bitcast %struct.BitFieldsByte*
91 // CHECK: %[[LOADC:.+]] = load i8, i8* %[[BFType]]
92 // CHECK: %[[CLEARC:.+]] = and i8 %[[LOADC]], 63
93 // CHECK: %[[SETC:.+]] = or i8 %[[CLEARC]], 64
94 }
95
96 enum AsEnumUnderlyingType : _ExtInt(9) {
97 A,B,C
98 };
99
UnderlyingTypeUsage(AsEnumUnderlyingType Param)100 void UnderlyingTypeUsage(AsEnumUnderlyingType Param) {
101 // LIN: define{{.*}} void @_Z19UnderlyingTypeUsage20AsEnumUnderlyingType(i9 signext %
102 // WIN: define dso_local void @"?UnderlyingTypeUsage@@YAXW4AsEnumUnderlyingType@@@Z"(i9 %
103 AsEnumUnderlyingType Var;
104 // CHECK: alloca i9, align 2
105 // CHECK: store i9 %{{.*}}, align 2
106 }
107
108 unsigned _ExtInt(33) ManglingTestRetParam(unsigned _ExtInt(33) Param) {
109 // LIN: define{{.*}} i64 @_Z20ManglingTestRetParamU7_ExtIntILi33EEj(i64 %
110 // WIN: define dso_local i33 @"?ManglingTestRetParam@@YAU?$_UExtInt@$0CB@@__clang@@U12@@Z"(i33
111 return 0;
112 }
113
114 _ExtInt(33) ManglingTestRetParam(_ExtInt(33) Param) {
115 // LIN: define{{.*}} i64 @_Z20ManglingTestRetParamU7_ExtIntILi33EEi(i64 %
116 // WIN: define dso_local i33 @"?ManglingTestRetParam@@YAU?$_ExtInt@$0CB@@__clang@@U12@@Z"(i33
117 return 0;
118 }
119
120 template<typename T>
121 void ManglingTestTemplateParam(T&);
122 template<_ExtInt(99) T>
123 void ManglingTestNTTP();
124
ManglingInstantiator()125 void ManglingInstantiator() {
126 // LIN: define{{.*}} void @_Z20ManglingInstantiatorv()
127 // WIN: define dso_local void @"?ManglingInstantiator@@YAXXZ"()
128 _ExtInt(93) A;
129 ManglingTestTemplateParam(A);
130 // LIN: call void @_Z25ManglingTestTemplateParamIU7_ExtIntILi93EEiEvRT_(i93*
131 // WIN: call void @"??$ManglingTestTemplateParam@U?$_ExtInt@$0FN@@__clang@@@@YAXAEAU?$_ExtInt@$0FN@@__clang@@@Z"(i93*
132 constexpr _ExtInt(93) B = 993;
133 ManglingTestNTTP<38>();
134 // LIN: call void @_Z16ManglingTestNTTPILU7_ExtIntILi99EEi38EEvv()
135 // WIN: call void @"??$ManglingTestNTTP@$0CG@@@YAXXZ"()
136 ManglingTestNTTP<B>();
137 // LIN: call void @_Z16ManglingTestNTTPILU7_ExtIntILi99EEi993EEvv()
138 // WIN: call void @"??$ManglingTestNTTP@$0DOB@@@YAXXZ"()
139 }
140
TakesVarargs(int i,...)141 void TakesVarargs(int i, ...) {
142 // LIN: define{{.*}} void @_Z12TakesVarargsiz(i32 %i, ...)
143 // WIN: define dso_local void @"?TakesVarargs@@YAXHZZ"(i32 %i, ...)
144
145 __builtin_va_list args;
146 // LIN: %[[ARGS:.+]] = alloca [1 x %struct.__va_list_tag]
147 // WIN: %[[ARGS:.+]] = alloca i8*
148 __builtin_va_start(args, i);
149 // LIN: %[[STARTAD:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]]
150 // LIN: %[[STARTAD1:.+]] = bitcast %struct.__va_list_tag* %[[STARTAD]] to i8*
151 // LIN: call void @llvm.va_start(i8* %[[STARTAD1]])
152 // WIN: %[[ARGSLLIFETIMESTART:.+]] = bitcast i8** %[[ARGS]] to i8*
153 // WIN: %[[ARGSSTART:.+]] = bitcast i8** %[[ARGS]] to i8*
154 // WIN: call void @llvm.va_start(i8* %[[ARGSSTART]])
155
156 _ExtInt(92) A = __builtin_va_arg(args, _ExtInt(92));
157 // LIN: %[[AD1:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]]
158 // LIN: %[[OFA_P1:.+]] = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %[[AD1]], i32 0, i32 0
159 // LIN: %[[GPOFFSET:.+]] = load i32, i32* %[[OFA_P1]]
160 // LIN: %[[FITSINGP:.+]] = icmp ule i32 %[[GPOFFSET]], 32
161 // LIN: br i1 %[[FITSINGP]]
162 // LIN: %[[BC1:.+]] = phi i92*
163 // LIN: %[[LOAD1:.+]] = load i92, i92* %[[BC1]]
164 // LIN: store i92 %[[LOAD1]], i92*
165
166 // WIN: %[[CUR1:.+]] = load i8*, i8** %[[ARGS]]
167 // WIN: %[[NEXT1:.+]] = getelementptr inbounds i8, i8* %[[CUR1]], i64 8
168 // WIN: store i8* %[[NEXT1]], i8** %[[ARGS]]
169 // WIN: %[[BC1:.+]] = bitcast i8* %[[CUR1]] to i92**
170 // WIN: %[[LOADP1:.+]] = load i92*, i92** %[[BC1]]
171 // WIN: %[[LOADV1:.+]] = load i92, i92* %[[LOADP1]]
172 // WIN: store i92 %[[LOADV1]], i92*
173
174 _ExtInt(31) B = __builtin_va_arg(args, _ExtInt(31));
175 // LIN: %[[AD2:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]]
176 // LIN: %[[OFA_P2:.+]] = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %[[AD2]], i32 0, i32 0
177 // LIN: %[[GPOFFSET:.+]] = load i32, i32* %[[OFA_P2]]
178 // LIN: %[[FITSINGP:.+]] = icmp ule i32 %[[GPOFFSET]], 40
179 // LIN: br i1 %[[FITSINGP]]
180 // LIN: %[[BC1:.+]] = phi i31*
181 // LIN: %[[LOAD1:.+]] = load i31, i31* %[[BC1]]
182 // LIN: store i31 %[[LOAD1]], i31*
183
184 // WIN: %[[CUR2:.+]] = load i8*, i8** %[[ARGS]]
185 // WIN: %[[NEXT2:.+]] = getelementptr inbounds i8, i8* %[[CUR2]], i64 8
186 // WIN: store i8* %[[NEXT2]], i8** %[[ARGS]]
187 // WIN: %[[BC2:.+]] = bitcast i8* %[[CUR2]] to i31*
188 // WIN: %[[LOADV2:.+]] = load i31, i31* %[[BC2]]
189 // WIN: store i31 %[[LOADV2]], i31*
190
191 _ExtInt(16) C = __builtin_va_arg(args, _ExtInt(16));
192 // LIN: %[[AD3:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]]
193 // LIN: %[[OFA_P3:.+]] = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %[[AD3]], i32 0, i32 0
194 // LIN: %[[GPOFFSET:.+]] = load i32, i32* %[[OFA_P3]]
195 // LIN: %[[FITSINGP:.+]] = icmp ule i32 %[[GPOFFSET]], 40
196 // LIN: br i1 %[[FITSINGP]]
197 // LIN: %[[BC1:.+]] = phi i16*
198 // LIN: %[[LOAD1:.+]] = load i16, i16* %[[BC1]]
199 // LIN: store i16 %[[LOAD1]], i16*
200
201 // WIN: %[[CUR3:.+]] = load i8*, i8** %[[ARGS]]
202 // WIN: %[[NEXT3:.+]] = getelementptr inbounds i8, i8* %[[CUR3]], i64 8
203 // WIN: store i8* %[[NEXT3]], i8** %[[ARGS]]
204 // WIN: %[[BC3:.+]] = bitcast i8* %[[CUR3]] to i16*
205 // WIN: %[[LOADV3:.+]] = load i16, i16* %[[BC3]]
206 // WIN: store i16 %[[LOADV3]], i16*
207
208 _ExtInt(129) D = __builtin_va_arg(args, _ExtInt(129));
209 // LIN: %[[AD4:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]]
210 // LIN: %[[OFA_P4:.+]] = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %[[AD4]], i32 0, i32 2
211 // LIN: %[[OFA4:.+]] = load i8*, i8** %[[OFA_P4]]
212 // LIN: %[[BC4:.+]] = bitcast i8* %[[OFA4]] to i129*
213 // LIN: %[[OFANEXT4:.+]] = getelementptr i8, i8* %[[OFA4]], i32 24
214 // LIN: store i8* %[[OFANEXT4]], i8** %[[OFA_P4]]
215 // LIN: %[[LOAD4:.+]] = load i129, i129* %[[BC4]]
216 // LIN: store i129 %[[LOAD4]], i129*
217
218 // WIN: %[[CUR4:.+]] = load i8*, i8** %[[ARGS]]
219 // WIN: %[[NEXT4:.+]] = getelementptr inbounds i8, i8* %[[CUR4]], i64 8
220 // WIN: store i8* %[[NEXT4]], i8** %[[ARGS]]
221 // WIN: %[[BC4:.+]] = bitcast i8* %[[CUR4]] to i129**
222 // WIN: %[[LOADP4:.+]] = load i129*, i129** %[[BC4]]
223 // WIN: %[[LOADV4:.+]] = load i129, i129* %[[LOADP4]]
224 // WIN: store i129 %[[LOADV4]], i129*
225
226 _ExtInt(16777200) E = __builtin_va_arg(args, _ExtInt(16777200));
227 // LIN: %[[AD5:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]]
228 // LIN: %[[OFA_P5:.+]] = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %[[AD5]], i32 0, i32 2
229 // LIN: %[[OFA5:.+]] = load i8*, i8** %[[OFA_P5]]
230 // LIN: %[[BC5:.+]] = bitcast i8* %[[OFA5]] to i16777200*
231 // LIN: %[[OFANEXT5:.+]] = getelementptr i8, i8* %[[OFA5]], i32 2097152
232 // LIN: store i8* %[[OFANEXT5]], i8** %[[OFA_P5]]
233 // LIN: %[[LOAD5:.+]] = load i16777200, i16777200* %[[BC5]]
234 // LIN: store i16777200 %[[LOAD5]], i16777200*
235
236 // WIN: %[[CUR5:.+]] = load i8*, i8** %[[ARGS]]
237 // WIN: %[[NEXT5:.+]] = getelementptr inbounds i8, i8* %[[CUR5]], i64 8
238 // WIN: store i8* %[[NEXT5]], i8** %[[ARGS]]
239 // WIN: %[[BC5:.+]] = bitcast i8* %[[CUR5]] to i16777200**
240 // WIN: %[[LOADP5:.+]] = load i16777200*, i16777200** %[[BC5]]
241 // WIN: %[[LOADV5:.+]] = load i16777200, i16777200* %[[LOADP5]]
242 // WIN: store i16777200 %[[LOADV5]], i16777200*
243
244 __builtin_va_end(args);
245 // LIN: %[[ENDAD:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]]
246 // LIN: %[[ENDAD1:.+]] = bitcast %struct.__va_list_tag* %[[ENDAD]] to i8*
247 // LIN: call void @llvm.va_end(i8* %[[ENDAD1]])
248 // WIN: %[[ARGSEND:.+]] = bitcast i8** %[[ARGS]] to i8*
249 // WIN: call void @llvm.va_end(i8* %[[ARGSEND]])
250 }
typeid_tests()251 void typeid_tests() {
252 // LIN: define{{.*}} void @_Z12typeid_testsv()
253 // WIN: define dso_local void @"?typeid_tests@@YAXXZ"()
254 unsigned _ExtInt(33) U33_1, U33_2;
255 _ExtInt(33) S33_1, S33_2;
256 _ExtInt(32) S32_1, S32_2;
257
258 auto A = typeid(U33_1);
259 // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi33EEj to %"class.std::type_info"*))
260 // WIN: call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast (%rtti.TypeDescriptor28* @"??_R0U?$_UExtInt@$0CB@@__clang@@@8" to %"class.std::type_info"*))
261 auto B = typeid(U33_2);
262 // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi33EEj to %"class.std::type_info"*))
263 // WIN: call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast (%rtti.TypeDescriptor28* @"??_R0U?$_UExtInt@$0CB@@__clang@@@8" to %"class.std::type_info"*))
264 auto C = typeid(S33_1);
265 // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi33EEi to %"class.std::type_info"*))
266 // WIN: call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast (%rtti.TypeDescriptor27* @"??_R0U?$_ExtInt@$0CB@@__clang@@@8" to %"class.std::type_info"*))
267 auto D = typeid(S33_2);
268 // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi33EEi to %"class.std::type_info"*))
269 // WIN: call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast (%rtti.TypeDescriptor27* @"??_R0U?$_ExtInt@$0CB@@__clang@@@8" to %"class.std::type_info"*))
270 auto E = typeid(S32_1);
271 // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi32EEi to %"class.std::type_info"*))
272 // WIN: call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast (%rtti.TypeDescriptor27* @"??_R0U?$_ExtInt@$0CA@@__clang@@@8" to %"class.std::type_info"*))
273 auto F = typeid(S32_2);
274 // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi32EEi to %"class.std::type_info"*))
275 // WIN: call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* {{[^,]*}} %{{.+}}, %"class.std::type_info"* nonnull align 8 dereferenceable(16) bitcast (%rtti.TypeDescriptor27* @"??_R0U?$_ExtInt@$0CA@@__clang@@@8" to %"class.std::type_info"*))
276 }
277
ExplicitCasts()278 void ExplicitCasts() {
279 // LIN: define{{.*}} void @_Z13ExplicitCastsv()
280 // WIN: define dso_local void @"?ExplicitCasts@@YAXXZ"()
281
282 _ExtInt(33) a;
283 _ExtInt(31) b;
284 int i;
285
286 a = i;
287 // CHECK: %[[CONV:.+]] = sext i32 %{{.+}} to i33
288 b = i;
289 // CHECK: %[[CONV:.+]] = trunc i32 %{{.+}} to i31
290 i = a;
291 // CHECK: %[[CONV:.+]] = trunc i33 %{{.+}} to i32
292 i = b;
293 // CHECK: %[[CONV:.+]] = sext i31 %{{.+}} to i32
294 }
295
296 struct S {
297 _ExtInt(17) A;
298 _ExtInt(16777200) B;
299 _ExtInt(17) C;
300 };
301
OffsetOfTest()302 void OffsetOfTest() {
303 // LIN: define{{.*}} void @_Z12OffsetOfTestv()
304 // WIN: define dso_local void @"?OffsetOfTest@@YAXXZ"()
305
306 auto A = __builtin_offsetof(S,A);
307 // CHECK: store i64 0, i64* %{{.+}}
308 auto B = __builtin_offsetof(S,B);
309 // CHECK: store i64 8, i64* %{{.+}}
310 auto C = __builtin_offsetof(S,C);
311 // CHECK: store i64 2097160, i64* %{{.+}}
312 }
313
314
315 void ShiftExtIntByConstant(_ExtInt(28) Ext) {
316 // LIN: define{{.*}} void @_Z21ShiftExtIntByConstantU7_ExtIntILi28EEi
317 // WIN: define dso_local void @"?ShiftExtIntByConstant@@YAXU?$_ExtInt@$0BM@@__clang@@@Z"
318 Ext << 7;
319 // CHECK: shl i28 %{{.+}}, 7
320 Ext >> 7;
321 // CHECK: ashr i28 %{{.+}}, 7
322 Ext << -7;
323 // CHECK: shl i28 %{{.+}}, -7
324 Ext >> -7;
325 // CHECK: ashr i28 %{{.+}}, -7
326
327 // UB in C/C++, Defined in OpenCL.
328 Ext << 29;
329 // CHECK: shl i28 %{{.+}}, 29
330 Ext >> 29;
331 // CHECK: ashr i28 %{{.+}}, 29
332 }
333
334 void ConstantShiftByExtInt(_ExtInt(28) Ext, _ExtInt(65) LargeExt) {
335 // LIN: define{{.*}} void @_Z21ConstantShiftByExtIntU7_ExtIntILi28EEiU7_ExtIntILi65EEi
336 // WIN: define dso_local void @"?ConstantShiftByExtInt@@YAXU?$_ExtInt@$0BM@@__clang@@U?$_ExtInt@$0EB@@2@@Z"
337 10 << Ext;
338 // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i32
339 // CHECK: shl i32 10, %[[PROMO]]
340 10 >> Ext;
341 // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i32
342 // CHECK: ashr i32 10, %[[PROMO]]
343 10 << LargeExt;
344 // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i32
345 // CHECK: shl i32 10, %[[PROMO]]
346 10 >> LargeExt;
347 // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i32
348 // CHECK: ashr i32 10, %[[PROMO]]
349 }
350
351 void Shift(_ExtInt(28) Ext, _ExtInt(65) LargeExt, int i) {
352 // LIN: define{{.*}} void @_Z5ShiftU7_ExtIntILi28EEiU7_ExtIntILi65EEii
353 // WIN: define dso_local void @"?Shift@@YAXU?$_ExtInt@$0BM@@__clang@@U?$_ExtInt@$0EB@@2@H@Z"
354 i << Ext;
355 // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i32
356 // CHECK: shl i32 {{.+}}, %[[PROMO]]
357 i >> Ext;
358 // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i32
359 // CHECK: ashr i32 {{.+}}, %[[PROMO]]
360
361 i << LargeExt;
362 // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i32
363 // CHECK: shl i32 {{.+}}, %[[PROMO]]
364 i >> LargeExt;
365 // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i32
366 // CHECK: ashr i32 {{.+}}, %[[PROMO]]
367
368 Ext << i;
369 // CHECK: %[[PROMO:.+]] = trunc i32 %{{.+}} to i28
370 // CHECK: shl i28 {{.+}}, %[[PROMO]]
371 Ext >> i;
372 // CHECK: %[[PROMO:.+]] = trunc i32 %{{.+}} to i28
373 // CHECK: ashr i28 {{.+}}, %[[PROMO]]
374
375 LargeExt << i;
376 // CHECK: %[[PROMO:.+]] = zext i32 %{{.+}} to i65
377 // CHECK: shl i65 {{.+}}, %[[PROMO]]
378 LargeExt >> i;
379 // CHECK: %[[PROMO:.+]] = zext i32 %{{.+}} to i65
380 // CHECK: ashr i65 {{.+}}, %[[PROMO]]
381
382 Ext << LargeExt;
383 // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i28
384 // CHECK: shl i28 {{.+}}, %[[PROMO]]
385 Ext >> LargeExt;
386 // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i28
387 // CHECK: ashr i28 {{.+}}, %[[PROMO]]
388
389 LargeExt << Ext;
390 // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i65
391 // CHECK: shl i65 {{.+}}, %[[PROMO]]
392 LargeExt >> Ext;
393 // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i65
394 // CHECK: ashr i65 {{.+}}, %[[PROMO]]
395 }
396
397 void ComplexTest(_Complex _ExtInt(12) first,
398 _Complex _ExtInt(33) second) {
399 // LIN: define{{.*}} void @_Z11ComplexTestCU7_ExtIntILi12EEiCU7_ExtIntILi33EEi
400 // WIN: define dso_local void @"?ComplexTest@@YAXU?$_Complex@U?$_ExtInt@$0M@@__clang@@@__clang@@U?$_Complex@U?$_ExtInt@$0CB@@__clang@@@2@@Z"
401 first + second;
402 // CHECK: %[[FIRST_REALP:.+]] = getelementptr inbounds { i12, i12 }, { i12, i12 }* %{{.+}}, i32 0, i32 0
403 // CHECK: %[[FIRST_REAL:.+]] = load i12, i12* %[[FIRST_REALP]]
404 // CHECK: %[[FIRST_IMAGP:.+]] = getelementptr inbounds { i12, i12 }, { i12, i12 }* %{{.+}}, i32 0, i32 1
405 // CHECK: %[[FIRST_IMAG:.+]] = load i12, i12* %[[FIRST_IMAGP]]
406 // CHECK: %[[FIRST_REAL_CONV:.+]] = sext i12 %[[FIRST_REAL]]
407 // CHECK: %[[FIRST_IMAG_CONV:.+]] = sext i12 %[[FIRST_IMAG]]
408 // CHECK: %[[SECOND_REALP:.+]] = getelementptr inbounds { i33, i33 }, { i33, i33 }* %{{.+}}, i32 0, i32 0
409 // CHECK: %[[SECOND_REAL:.+]] = load i33, i33* %[[SECOND_REALP]]
410 // CHECK: %[[SECOND_IMAGP:.+]] = getelementptr inbounds { i33, i33 }, { i33, i33 }* %{{.+}}, i32 0, i32 1
411 // CHECK: %[[SECOND_IMAG:.+]] = load i33, i33* %[[SECOND_IMAGP]]
412 // CHECK: %[[REAL:.+]] = add i33 %[[FIRST_REAL_CONV]], %[[SECOND_REAL]]
413 // CHECK: %[[IMAG:.+]] = add i33 %[[FIRST_IMAG_CONV]], %[[SECOND_IMAG]]
414 }
415
416 // Ensure that these types don't alias the normal int types.
417 void TBAATest(_ExtInt(sizeof(int) * 8) ExtInt,
418 unsigned _ExtInt(sizeof(int) * 8) ExtUInt,
419 _ExtInt(6) Other) {
420 // CHECK-DAG: store i32 %{{.+}}, i32* %{{.+}}, align 4, !tbaa ![[EXTINT_TBAA:.+]]
421 // CHECK-DAG: store i32 %{{.+}}, i32* %{{.+}}, align 4, !tbaa ![[EXTINT_TBAA]]
422 // CHECK-DAG: store i6 %{{.+}}, i6* %{{.+}}, align 1, !tbaa ![[EXTINT6_TBAA:.+]]
423 ExtInt = 5;
424 ExtUInt = 5;
425 Other = 5;
426 }
427
428 // NoNewStructPathTBAA-DAG: ![[CHAR_TBAA_ROOT:.+]] = !{!"omnipotent char", ![[TBAA_ROOT:.+]], i64 0}
429 // NoNewStructPathTBAA-DAG: ![[TBAA_ROOT]] = !{!"Simple C++ TBAA"}
430 // NoNewStructPathTBAA-DAG: ![[EXTINT_TBAA]] = !{![[EXTINT_TBAA_ROOT:.+]], ![[EXTINT_TBAA_ROOT]], i64 0}
431 // NoNewStructPathTBAA-DAG: ![[EXTINT_TBAA_ROOT]] = !{!"_ExtInt(32)", ![[CHAR_TBAA_ROOT]], i64 0}
432 // NoNewStructPathTBAA-DAG: ![[EXTINT6_TBAA]] = !{![[EXTINT6_TBAA_ROOT:.+]], ![[EXTINT6_TBAA_ROOT]], i64 0}
433 // NoNewStructPathTBAA-DAG: ![[EXTINT6_TBAA_ROOT]] = !{!"_ExtInt(6)", ![[CHAR_TBAA_ROOT]], i64 0}
434
435 // NewStructPathTBAA-DAG: ![[CHAR_TBAA_ROOT:.+]] = !{![[TBAA_ROOT:.+]], i64 1, !"omnipotent char"}
436 // NewStructPathTBAA-DAG: ![[TBAA_ROOT]] = !{!"Simple C++ TBAA"}
437 // NewStructPathTBAA-DAG: ![[EXTINT_TBAA]] = !{![[EXTINT_TBAA_ROOT:.+]], ![[EXTINT_TBAA_ROOT]], i64 0, i64 4}
438 // NewStructPathTBAA-DAG: ![[EXTINT_TBAA_ROOT]] = !{![[CHAR_TBAA_ROOT]], i64 4, !"_ExtInt(32)"}
439 // NewStructPathTBAA-DAG: ![[EXTINT6_TBAA]] = !{![[EXTINT6_TBAA_ROOT:.+]], ![[EXTINT6_TBAA_ROOT]], i64 0, i64 1}
440 // NewStructPathTBAA-DAG: ![[EXTINT6_TBAA_ROOT]] = !{![[CHAR_TBAA_ROOT]], i64 1, !"_ExtInt(6)"}
441