xref: /llvm-project/clang/test/CodeGenCXX/ext-int.cpp (revision 1d65c35ce16f1bc340649ac8319b34c833e23a1f)
1 // RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-gnu-linux -O3 -disable-llvm-passes -I%S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,LIN,LIN64,NoNewStructPathTBAA
2 // RUN: %clang_cc1 -no-enable-noundef-analysis -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,LIN64,NewStructPathTBAA
3 
4 // RUN: %clang_cc1 -no-enable-noundef-analysis -triple x86_64-windows-pc -O3 -disable-llvm-passes -I%S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,WIN,WIN64,NoNewStructPathTBAA
5 // RUN: %clang_cc1 -no-enable-noundef-analysis -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,WIN64,NewStructPathTBAA
6 
7 // RUN: %clang_cc1 -no-enable-noundef-analysis -triple i386-gnu-linux -O3 -disable-llvm-passes -I%S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,LIN,LIN32,NoNewStructPathTBAA
8 // RUN: %clang_cc1 -no-enable-noundef-analysis -triple i386-gnu-linux -O3 -disable-llvm-passes -I%S -new-struct-path-tbaa -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,LIN,LIN32,NewStructPathTBAA
9 
10 // RUN: %clang_cc1 -no-enable-noundef-analysis -triple i386-windows-pc -O3 -disable-llvm-passes -I%S -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,WIN,WIN32,NoNewStructPathTBAA
11 // RUN: %clang_cc1 -no-enable-noundef-analysis -triple i386-windows-pc -O3 -disable-llvm-passes -I%S -new-struct-path-tbaa -emit-llvm -o - %s | FileCheck %s --check-prefixes=CHECK,WIN,WIN32,NewStructPathTBAA
12 
13 namespace std {
14   class type_info { public: virtual ~type_info(); private: const char * name; };
15 } // namespace std
16 
17 // Ensure that the layout for these structs is the same as the normal bitfield
18 // layouts.
19 struct BitFieldsByte {
20   _BitInt(7) A : 3;
21   _BitInt(7) B : 3;
22   _BitInt(7) C : 2;
23 };
24 // CHECK: %struct.BitFieldsByte = type { i8 }
25 
26 struct BitFieldsShort {
27   _BitInt(15) A : 3;
28   _BitInt(15) B : 3;
29   _BitInt(15) C : 2;
30 };
31 // LIN: %struct.BitFieldsShort = type { i8, i8 }
32 // WIN: %struct.BitFieldsShort = type { i16 }
33 
34 struct BitFieldsInt {
35   _BitInt(31) A : 3;
36   _BitInt(31) B : 3;
37   _BitInt(31) C : 2;
38 };
39 // LIN: %struct.BitFieldsInt = type { i8, [3 x i8] }
40 // WIN: %struct.BitFieldsInt = type { i32 }
41 
42 struct BitFieldsLong {
43   _BitInt(63) A : 3;
44   _BitInt(63) B : 3;
45   _BitInt(63) C : 2;
46 };
47 // LIN64: %struct.BitFieldsLong = type { i8, [7 x i8] }
48 // LIN32: %struct.BitFieldsLong = type { i8, [3 x i8] }
49 // WIN: %struct.BitFieldsLong = type { i64 }
50 
51 struct HasBitIntFirst {
52   _BitInt(35) A;
53   int B;
54 };
55 // CHECK: %struct.HasBitIntFirst = type { i64, i32 }
56 
57 struct HasBitIntLast {
58   int A;
59   _BitInt(35) B;
60 };
61 // CHECK: %struct.HasBitIntLast = type { i32, i64 }
62 
63 struct HasBitIntMiddle {
64   int A;
65   _BitInt(35) B;
66   int C;
67 };
68 // CHECK: %struct.HasBitIntMiddle = type { i32, i64, i32 }
69 
70 // Force emitting of the above structs.
71 void StructEmit() {
72   BitFieldsByte A;
73   BitFieldsShort B;
74   BitFieldsInt C;
75   BitFieldsLong D;
76 
77   HasBitIntFirst E;
78   HasBitIntLast F;
79   HasBitIntMiddle G;
80 }
81 
82 void BitfieldAssignment() {
83   // LIN: define{{.*}} void @_Z18BitfieldAssignmentv
84   // WIN: define dso_local void  @"?BitfieldAssignment@@YAXXZ"
85   BitFieldsByte B;
86   B.A = 3;
87   B.B = 2;
88   B.C = 1;
89   // First one is used for the lifetime start, skip that.
90   // CHECK: %[[LOADA:.+]] = load i8, ptr %[[BFType:.*]]
91   // CHECK: %[[CLEARA:.+]] = and i8 %[[LOADA]], -8
92   // CHECK: %[[SETA:.+]] = or i8 %[[CLEARA]], 3
93   // CHECK: %[[LOADB:.+]] = load i8, ptr %[[BFType:.*]]
94   // CHECK: %[[CLEARB:.+]] = and i8 %[[LOADB]], -57
95   // CHECK: %[[SETB:.+]] = or i8 %[[CLEARB]], 16
96   // CHECK: %[[LOADC:.+]] = load i8, ptr %[[BFType:.*]]
97   // CHECK: %[[CLEARC:.+]] = and i8 %[[LOADC]], 63
98   // CHECK: %[[SETC:.+]] = or i8 %[[CLEARC]], 64
99 }
100 
101 unsigned _BitInt(33) ManglingTestRetParam(unsigned _BitInt(33) Param) {
102 // LIN64: define{{.*}} i64 @_Z20ManglingTestRetParamDU33_(i64 %
103 // LIN32: define{{.*}} i33 @_Z20ManglingTestRetParamDU33_(i33 %
104 // WIN: define dso_local i33 @"?ManglingTestRetParam@@YAU?$_UBitInt@$0CB@@__clang@@U12@@Z"(i33
105   return 0;
106 }
107 
108 _BitInt(33) ManglingTestRetParam(_BitInt(33) Param) {
109 // LIN64: define{{.*}} i64 @_Z20ManglingTestRetParamDB33_(i64 %
110 // LIN32: define{{.*}} i33 @_Z20ManglingTestRetParamDB33_(i33 %
111 // WIN: define dso_local i33 @"?ManglingTestRetParam@@YAU?$_BitInt@$0CB@@__clang@@U12@@Z"(i33
112   return 0;
113 }
114 
115 typedef unsigned _BitInt(16) uint16_t4 __attribute__((ext_vector_type(4)));
116 typedef _BitInt(32) vint32_t8 __attribute__((vector_size(32)));
117 
118 template<typename T>
119 void ManglingTestTemplateParam(T&);
120 template<_BitInt(99) T>
121 void ManglingTestNTTP();
122 template <int N>
123 auto ManglingDependent() -> decltype(_BitInt(N){});
124 
125 void ManglingInstantiator() {
126   // LIN: define{{.*}} void @_Z20ManglingInstantiatorv()
127   // WIN: define dso_local void @"?ManglingInstantiator@@YAXXZ"()
128   _BitInt(93) A;
129   ManglingTestTemplateParam(A);
130 // LIN: call void @_Z25ManglingTestTemplateParamIDB93_EvRT_(ptr
131 // WIN64: call void @"??$ManglingTestTemplateParam@U?$_BitInt@$0FN@@__clang@@@@YAXAEAU?$_BitInt@$0FN@@__clang@@@Z"(ptr
132 // WIN32: call void @"??$ManglingTestTemplateParam@U?$_BitInt@$0FN@@__clang@@@@YAXAAU?$_BitInt@$0FN@@__clang@@@Z"(ptr
133   constexpr _BitInt(93) B = 993;
134   ManglingTestNTTP<38>();
135   // LIN: call void @_Z16ManglingTestNTTPILDB99_38EEvv()
136   // WIN: call void @"??$ManglingTestNTTP@$0CG@@@YAXXZ"()
137   ManglingTestNTTP<B>();
138   // LIN: call void @_Z16ManglingTestNTTPILDB99_993EEvv()
139   // WIN: call void @"??$ManglingTestNTTP@$0DOB@@@YAXXZ"()
140   ManglingDependent<4>();
141   // LIN: call signext i4 @_Z17ManglingDependentILi4EEDTtlDBT__EEv()
142   // WIN64: call i4 @"??$ManglingDependent@$03@@YAU?$_BitInt@$03@__clang@@XZ"()
143   // WIN32: call signext i4 @"??$ManglingDependent@$03@@YAU?$_BitInt@$03@__clang@@XZ"()
144   uint16_t4 V;
145   ManglingTestTemplateParam(V);
146   // LIN: call void @_Z25ManglingTestTemplateParamIDv4_DU16_EvRT_(ptr
147   // WIN64: call void @"??$ManglingTestTemplateParam@T?$__vector@U?$_UBitInt@$0BA@@__clang@@$03@__clang@@@@YAXAEAT?$__vector@U?$_UBitInt@$0BA@@__clang@@$03@__clang@@@Z"(ptr
148   // WIN32: call void @"??$ManglingTestTemplateParam@T?$__vector@U?$_UBitInt@$0BA@@__clang@@$03@__clang@@@@YAXAAT?$__vector@U?$_UBitInt@$0BA@@__clang@@$03@__clang@@@Z"(ptr
149 
150 }
151 
152 void TakesVarargs(int i, ...) {
153   // LIN: define{{.*}} void @_Z12TakesVarargsiz(i32 %i, ...)
154   // WIN: define dso_local void @"?TakesVarargs@@YAXHZZ"(i32 %i, ...)
155 
156   __builtin_va_list args;
157   // LIN64: %[[ARGS:.+]] = alloca [1 x %struct.__va_list_tag]
158   // LIN32: %[[ARGS:.+]] = alloca ptr
159   // WIN: %[[ARGS:.+]] = alloca ptr
160   __builtin_va_start(args, i);
161   // LIN64: %[[STARTAD:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %[[ARGS]]
162   // LIN64: call void @llvm.va_start.p0(ptr %[[STARTAD]])
163   // LIN32: call void @llvm.va_start.p0(ptr %[[ARGS]])
164   // WIN: call void @llvm.va_start.p0(ptr %[[ARGS]])
165 
166   _BitInt(92) A = __builtin_va_arg(args, _BitInt(92));
167   // LIN64: %[[AD1:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %[[ARGS]]
168   // LIN64: %[[OFA_P1:.+]] = getelementptr inbounds nuw %struct.__va_list_tag, ptr %[[AD1]], i32 0, i32 0
169   // LIN64: %[[GPOFFSET:.+]] = load i32, ptr %[[OFA_P1]]
170   // LIN64: %[[FITSINGP:.+]] = icmp ule i32 %[[GPOFFSET]], 32
171   // LIN64: br i1 %[[FITSINGP]]
172   // LIN64: %[[BC1:.+]] = phi ptr
173   // LIN64: %[[LOAD1:.+]] = load i128, ptr %[[BC1]]
174   // LIN64: %[[T:.+]] = trunc i128 %[[LOAD1]] to i92
175   // LIN64: %[[S:.+]] = sext i92 %[[T]] to i128
176   // LIN64: store i128 %[[S]], ptr
177 
178   // LIN32: %[[CUR1:.+]] = load ptr, ptr %[[ARGS]]
179   // LIN32: %[[NEXT1:.+]] = getelementptr inbounds i8, ptr %[[CUR1]], i32 12
180   // LIN32: store ptr %[[NEXT1]], ptr %[[ARGS]]
181   // LIN32: %[[LOADV1:.+]] = load i96, ptr %[[CUR1]]
182   // LIN32: %[[TR:.+]] = trunc i96 %[[LOADV1]] to i92
183   // LIN32: %[[SEXT:.+]] = sext i92 %[[TR]] to i96
184   // LIN32: store i96 %[[SEXT]], ptr
185 
186   // WIN64: %[[CUR1:.+]] = load ptr, ptr %[[ARGS]]
187   // WIN64: %[[NEXT1:.+]] = getelementptr inbounds i8, ptr %[[CUR1]], i64 8
188   // WIN64: store ptr %[[NEXT1]], ptr %[[ARGS]]
189   // WIN64: %[[LOADP1:.+]] = load ptr, ptr %[[CUR1]]
190   // WIN64: %[[LOADV1:.+]] = load i128, ptr %[[LOADP1]]
191   // WIN64: %[[TR:.+]] = trunc i128 %[[LOADV1]] to i92
192   // WIN64: %[[SEXT:.+]] = sext i92 %[[TR]] to i128
193   // WIN64: store i128 %[[SEXT]], ptr
194 
195   // WIN32: %[[CUR1:.+]] = load ptr, ptr %[[ARGS]]
196   // WIN32: %[[NEXT1:.+]] = getelementptr inbounds i8, ptr %[[CUR1]], i32 16
197   // WIN32: store ptr %[[NEXT1]], ptr %[[ARGS]]
198   // WIN32: %[[LOADV1:.+]] = load i128, ptr %[[CUR1]]
199   // WIN32: %[[TR:.+]] = trunc i128 %[[LOADV1]] to i92
200   // WIN32: %[[SEXT:.+]] = sext i92 %[[TR]] to i128
201   // WIN32: store i128 %[[SEXT]], ptr
202 
203 
204   _BitInt(31) B = __builtin_va_arg(args, _BitInt(31));
205   // LIN64: %[[AD2:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %[[ARGS]]
206   // LIN64: %[[OFA_P2:.+]] = getelementptr inbounds nuw %struct.__va_list_tag, ptr %[[AD2]], i32 0, i32 0
207   // LIN64: %[[GPOFFSET:.+]] = load i32, ptr %[[OFA_P2]]
208   // LIN64: %[[FITSINGP:.+]] = icmp ule i32 %[[GPOFFSET]], 40
209   // LIN64: br i1 %[[FITSINGP]]
210   // LIN64: %[[BC1:.+]] = phi ptr
211   // LIN64: %[[LOAD1:.+]] = load i32, ptr %[[BC1]]
212   // LIN64: %[[T:.+]] = trunc i32 %[[LOAD1]] to i31
213   // LIN64: %[[S:.+]] = sext i31 %[[T]] to i32
214   // LIN64: store i32 %[[S]], ptr
215 
216   // LIN32: %[[CUR2:.+]] = load ptr, ptr %[[ARGS]]
217   // LIN32: %[[NEXT2:.+]] = getelementptr inbounds i8, ptr %[[CUR2]], i32 4
218   // LIN32: store ptr %[[NEXT2]], ptr %[[ARGS]]
219   // LIN32: %[[LOADV2:.+]] = load i32, ptr %[[CUR2]]
220   // LIN32: %[[T:.+]] = trunc i32 %[[LOADV2]] to i31
221   // LIN32: %[[S:.+]] = sext i31 %[[T]] to i32
222   // LIN32: store i32 %[[S]], ptr
223 
224   // WIN64: %[[CUR2:.+]] = load ptr, ptr %[[ARGS]]
225   // WIN64: %[[NEXT2:.+]] = getelementptr inbounds i8, ptr %[[CUR2]], i64 8
226   // WIN64: store ptr %[[NEXT2]], ptr %[[ARGS]]
227   // WIN64: %[[LOADV2:.+]] = load i32, ptr %[[CUR2]]
228   // WIN64: %[[T:.+]] = trunc i32 %[[LOADV2]] to i31
229   // WIN64: %[[S:.+]] = sext i31 %[[T]] to i32
230   // WIN64: store i32 %[[S]], ptr
231 
232   // WIN32: %[[CUR2:.+]] = load ptr, ptr %[[ARGS]]
233   // WIN32: %[[NEXT2:.+]] = getelementptr inbounds i8, ptr %[[CUR2]], i32 4
234   // WIN32: store ptr %[[NEXT2]], ptr %[[ARGS]]
235   // WIN32: %[[LOADV2:.+]] = load i32, ptr %[[CUR2]]
236   // WIN32: %[[T:.+]] = trunc i32 %[[LOADV2]] to i31
237   // WIN32: %[[S:.+]] = sext i31 %[[T]] to i32
238   // WIN32: store i32 %[[S]], ptr
239 
240   _BitInt(16) C = __builtin_va_arg(args, _BitInt(16));
241   // LIN64: %[[AD3:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %[[ARGS]]
242   // LIN64: %[[OFA_P3:.+]] = getelementptr inbounds nuw %struct.__va_list_tag, ptr %[[AD3]], i32 0, i32 0
243   // LIN64: %[[GPOFFSET:.+]] = load i32, ptr %[[OFA_P3]]
244   // LIN64: %[[FITSINGP:.+]] = icmp ule i32 %[[GPOFFSET]], 40
245   // LIN64: br i1 %[[FITSINGP]]
246   // LIN64: %[[BC1:.+]] = phi ptr
247   // LIN64: %[[LOAD1:.+]] = load i16, ptr %[[BC1]]
248   // LIN64: store i16 %[[LOAD1]], ptr
249 
250   // LIN32: %[[CUR3:.+]] = load ptr, ptr %[[ARGS]]
251   // LIN32: %[[NEXT3:.+]] = getelementptr inbounds i8, ptr %[[CUR3]], i32 4
252   // LIN32: store ptr %[[NEXT3]], ptr %[[ARGS]]
253   // LIN32: %[[LOADV3:.+]] = load i16, ptr %[[CUR3]]
254   // LIN32: store i16 %[[LOADV3]], ptr
255 
256   // WIN64: %[[CUR3:.+]] = load ptr, ptr %[[ARGS]]
257   // WIN64: %[[NEXT3:.+]] = getelementptr inbounds i8, ptr %[[CUR3]], i64 8
258   // WIN64: store ptr %[[NEXT3]], ptr %[[ARGS]]
259   // WIN64: %[[LOADV3:.+]] = load i16, ptr %[[CUR3]]
260   // WIN64: store i16 %[[LOADV3]], ptr
261 
262   // WIN32: %[[CUR3:.+]] = load ptr, ptr %[[ARGS]]
263   // WIN32: %[[NEXT3:.+]] = getelementptr inbounds i8, ptr %[[CUR3]], i32 4
264   // WIN32: store ptr %[[NEXT3]], ptr %[[ARGS]]
265   // WIN32: %[[LOADV3:.+]] = load i16, ptr %[[CUR3]]
266   // WIN32: store i16 %[[LOADV3]], ptr
267 
268   uint16_t4 D = __builtin_va_arg(args, uint16_t4);
269   // LIN64: %[[AD4:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %[[ARGS]]
270   // LIN64: %[[OFA_P4:.+]] = getelementptr inbounds nuw %struct.__va_list_tag, ptr %[[AD4]], i32 0, i32 1
271   // LIN64: %[[GPOFFSET:.+]] = load i32, ptr %[[OFA_P4]]
272   // LIN64: %[[FITSINGP:.+]] = icmp ule i32 %[[GPOFFSET]], 160
273   // LIN64: br i1 %[[FITSINGP]]
274   // LIN64: %[[BC4:.+]] = phi ptr
275   // LIN64: %[[LOADV4:.+]] = load <4 x i16>, ptr %[[BC4]]
276   // LIN64: store <4 x i16> %[[LOADV4]], ptr
277 
278   // LIN32: %[[CUR4:.+]] = load ptr, ptr %[[ARGS]]
279   // LIN32: %[[NEXT4:.+]] = getelementptr inbounds i8, ptr %[[CUR4]], i32 8
280   // LIN32: store ptr %[[NEXT4]], ptr %[[ARGS]]
281   // LIN32: %[[LOADV4:.+]] = load <4 x i16>, ptr %[[CUR4]]
282   // LIN32: store <4 x i16> %[[LOADV4]], ptr %
283 
284   // WIN: %[[CUR4:.+]] = load ptr, ptr %[[ARGS]]
285   // WIN64: %[[NEXT4:.+]] = getelementptr inbounds i8, ptr %[[CUR4]], i64 8
286   // WIN32: %[[NEXT4:.+]] = getelementptr inbounds i8, ptr %[[CUR4]], i32 8
287   // WIN: store ptr %[[NEXT4]], ptr %[[ARGS]]
288   // WIN: %[[LOADV4:.+]] = load <4 x i16>, ptr %[[CUR4]]
289   // WIN: store <4 x i16> %[[LOADV4]], ptr
290 
291   vint32_t8 E = __builtin_va_arg(args, vint32_t8);
292   // LIN64: %[[AD5:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %[[ARGS]]
293   // LIN64: %[[OFAA_P4:.+]] = getelementptr inbounds nuw %struct.__va_list_tag, ptr %[[AD5]], i32 0, i32 2
294   // LIN64: %[[OFAA:.+]] = load ptr, ptr %[[OFAA_P4]]
295 
296   // LIN64: [[OFAA_GEP:%.*]] = getelementptr inbounds i8, ptr %[[OFAA]], i32 31
297   // LIN64: %[[OFAA_ALIGNED:.*]] = call ptr @llvm.ptrmask.p0.i64(ptr [[OFAA_GEP]], i64 -32)
298   // LIN64: %[[LOADV5:.+]] = load <8 x i32>, ptr %[[OFAA_ALIGNED]]
299   // LIN64: store <8 x i32> %[[LOADV5]], ptr
300 
301   // LIN32: %[[CUR5:.+]] = load ptr, ptr %[[ARGS]]
302 
303   // LIN32: [[GEP_CUR5:%.*]] = getelementptr inbounds i8, ptr %[[CUR5]], i32 31
304   // LIN32: %[[CUR5_ALIGNED:.*]] = call ptr @llvm.ptrmask.p0.i32(ptr [[GEP_CUR5]], i32 -32)
305   // LIN32: %[[NEXT5:.+]] = getelementptr inbounds i8, ptr %[[CUR5_ALIGNED]], i32 32
306   // LIN32: store ptr %[[NEXT5]], ptr %[[ARGS]]
307   // LIN32: %[[LOADV5:.+]] = load <8 x i32>, ptr %[[CUR5_ALIGNED]]
308   // LIN32: store <8 x i32> %[[LOADV5]], ptr
309 
310   // WIN: %[[CUR5:.+]] = load ptr, ptr %[[ARGS]]
311   // WIN64: %[[NEXT5:.+]] = getelementptr inbounds i8, ptr %[[CUR5]], i64 8
312   // WIN32: %[[NEXT5:.+]] = getelementptr inbounds i8, ptr %[[CUR5]], i32 32
313   // WIN: store ptr %[[NEXT5]], ptr %[[ARGS]]
314   // WIN64: %[[LOADP5:.+]] = load ptr, ptr %[[CUR5]]
315   // WIN64: %[[LOADV5:.+]] = load <8 x i32>, ptr %[[LOADP5]]
316   // WIN32: %[[LOADV5:.+]] = load <8 x i32>, ptr %argp.cur9
317   // WIN: store <8 x i32> %[[LOADV5]], ptr
318 
319   __builtin_va_end(args);
320   // LIN64: %[[ENDAD:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], ptr %[[ARGS]]
321   // LIN64: call void @llvm.va_end.p0(ptr %[[ENDAD]])
322   // LIN32: call void @llvm.va_end.p0(ptr %[[ARGS]])
323   // WIN: call void @llvm.va_end.p0(ptr %[[ARGS]])
324 }
325 void typeid_tests() {
326   // LIN: define{{.*}} void @_Z12typeid_testsv()
327   // WIN: define dso_local void @"?typeid_tests@@YAXXZ"()
328   unsigned _BitInt(33) U33_1, U33_2;
329   _BitInt(33) S33_1, S33_2;
330   _BitInt(32) S32_1, S32_2;
331 
332  auto A = typeid(U33_1);
333  // LIN64: call void @_ZNSt9type_infoC1ERKS_(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 8 dereferenceable(16) @_ZTIDU33_)
334  // LIN32: call void @_ZNSt9type_infoC1ERKS_(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 4 dereferenceable(8) @_ZTIDU33_)
335  // WIN64: call ptr @"??0type_info@std@@QEAA@AEBV01@@Z"(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 8 dereferenceable(16) @"??_R0U?$_UBitInt@$0CB@@__clang@@@8")
336  // WIN32: call x86_thiscallcc ptr @"??0type_info@std@@QAE@ABV01@@Z"(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 4 dereferenceable(8) @"??_R0U?$_UBitInt@$0CB@@__clang@@@8")
337  auto B = typeid(U33_2);
338  // LIN64: call void @_ZNSt9type_infoC1ERKS_(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 8 dereferenceable(16) @_ZTIDU33_)
339  // LIN32: call void @_ZNSt9type_infoC1ERKS_(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 4 dereferenceable(8) @_ZTIDU33_)
340  // WIN64:  call ptr @"??0type_info@std@@QEAA@AEBV01@@Z"(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 8 dereferenceable(16) @"??_R0U?$_UBitInt@$0CB@@__clang@@@8")
341  // WIN32:  call x86_thiscallcc ptr @"??0type_info@std@@QAE@ABV01@@Z"(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 4 dereferenceable(8) @"??_R0U?$_UBitInt@$0CB@@__clang@@@8")
342  auto C = typeid(S33_1);
343  // LIN64: call void @_ZNSt9type_infoC1ERKS_(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 8 dereferenceable(16) @_ZTIDB33_)
344  // LIN32: call void @_ZNSt9type_infoC1ERKS_(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 4 dereferenceable(8) @_ZTIDB33_)
345  // WIN64:  call ptr @"??0type_info@std@@QEAA@AEBV01@@Z"(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 8 dereferenceable(16) @"??_R0U?$_BitInt@$0CB@@__clang@@@8")
346  // WIN32:  call x86_thiscallcc ptr @"??0type_info@std@@QAE@ABV01@@Z"(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 4 dereferenceable(8) @"??_R0U?$_BitInt@$0CB@@__clang@@@8")
347  auto D = typeid(S33_2);
348  // LIN64: call void @_ZNSt9type_infoC1ERKS_(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 8 dereferenceable(16) @_ZTIDB33_)
349  // LIN32: call void @_ZNSt9type_infoC1ERKS_(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 4 dereferenceable(8) @_ZTIDB33_)
350  // WIN64:  call ptr @"??0type_info@std@@QEAA@AEBV01@@Z"(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 8 dereferenceable(16) @"??_R0U?$_BitInt@$0CB@@__clang@@@8")
351  // WIN32:  call x86_thiscallcc ptr @"??0type_info@std@@QAE@ABV01@@Z"(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 4 dereferenceable(8) @"??_R0U?$_BitInt@$0CB@@__clang@@@8")
352  auto E = typeid(S32_1);
353  // LIN64: call void @_ZNSt9type_infoC1ERKS_(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 8 dereferenceable(16) @_ZTIDB32_)
354  // LIN32: call void @_ZNSt9type_infoC1ERKS_(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 4 dereferenceable(8) @_ZTIDB32_)
355  // WIN64:  call ptr @"??0type_info@std@@QEAA@AEBV01@@Z"(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 8 dereferenceable(16) @"??_R0U?$_BitInt@$0CA@@__clang@@@8")
356  // WIN32:  call x86_thiscallcc ptr @"??0type_info@std@@QAE@ABV01@@Z"(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 4 dereferenceable(8) @"??_R0U?$_BitInt@$0CA@@__clang@@@8")
357  auto F = typeid(S32_2);
358  // LIN64: call void @_ZNSt9type_infoC1ERKS_(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 8 dereferenceable(16) @_ZTIDB32_)
359  // LIN32: call void @_ZNSt9type_infoC1ERKS_(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 4 dereferenceable(8) @_ZTIDB32_)
360  // WIN64:  call ptr @"??0type_info@std@@QEAA@AEBV01@@Z"(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 8 dereferenceable(16) @"??_R0U?$_BitInt@$0CA@@__clang@@@8")
361  // WIN32:  call x86_thiscallcc ptr @"??0type_info@std@@QAE@ABV01@@Z"(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 4 dereferenceable(8) @"??_R0U?$_BitInt@$0CA@@__clang@@@8")
362  auto G = typeid(uint16_t4);
363  // LIN64: call void @_ZNSt9type_infoC1ERKS_(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 8 dereferenceable(16) @_ZTIDv4_DU16_)
364  // LIN32: call void @_ZNSt9type_infoC1ERKS_(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 4 dereferenceable(8) @_ZTIDv4_DU16_)
365  // WIN64: call ptr @"??0type_info@std@@QEAA@AEBV01@@Z"(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 8 dereferenceable(16) @"??_R0T?$__vector@U?$_UBitInt@$0BA@@__clang@@$03@__clang@@@8")
366  // WIN32: call x86_thiscallcc ptr @"??0type_info@std@@QAE@ABV01@@Z"(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 4 dereferenceable(8) @"??_R0T?$__vector@U?$_UBitInt@$0BA@@__clang@@$03@__clang@@@8")
367  auto H = typeid(vint32_t8);
368  // LIN64: call void @_ZNSt9type_infoC1ERKS_(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 8 dereferenceable(16) @_ZTIDv8_DB32_)
369  // LIN32: call void @_ZNSt9type_infoC1ERKS_(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 4 dereferenceable(8) @_ZTIDv8_DB32_)
370  // WIN64: call ptr @"??0type_info@std@@QEAA@AEBV01@@Z"(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 8 dereferenceable(16) @"??_R0?AT?$__vector@U?$_BitInt@$0CA@@__clang@@$07@__clang@@@8")
371  // WIN32: call x86_thiscallcc ptr @"??0type_info@std@@QAE@ABV01@@Z"(ptr {{[^,]*}} %{{.+}}, ptr nonnull align 4 dereferenceable(8) @"??_R0?AT?$__vector@U?$_BitInt@$0CA@@__clang@@$07@__clang@@@8")
372 }
373 
374 void ExplicitCasts() {
375   // LIN: define{{.*}} void @_Z13ExplicitCastsv()
376   // WIN: define dso_local void @"?ExplicitCasts@@YAXXZ"()
377 
378   _BitInt(33) a;
379   _BitInt(31) b;
380   int i;
381 
382   a = i;
383   // CHECK: %[[CONV:.+]] = sext i32 %{{.+}} to i33
384   b = i;
385   // CHECK: %[[CONV:.+]] = trunc i32 %{{.+}} to i31
386   i = a;
387   // CHECK: %[[CONV:.+]] = trunc i33 %{{.+}} to i32
388   i = b;
389   // CHECK: %[[CONV:.+]] = sext i31 %{{.+}} to i32
390   uint16_t4 c;
391   c = i;
392   // CHECK: %[[CONV:.+]] = trunc i32 %{{.+}} to i16
393   // CHECK: %[[VEC:.+]] = insertelement <4 x i16> poison, i16 %[[CONV]], i64 0
394   // CHECK: %[[Splat:.+]] = shufflevector <4 x i16> %[[VEC]], <4 x i16> poison, <4 x i32> zeroinitializer
395 }
396 
397 struct S {
398   _BitInt(17) A;
399   _BitInt(128) B;
400   _BitInt(17) C;
401   uint16_t4 D;
402   vint32_t8 E;
403 };
404 
405 void OffsetOfTest() {
406   // LIN: define{{.*}} void @_Z12OffsetOfTestv()
407   // WIN: define dso_local void @"?OffsetOfTest@@YAXXZ"()
408 
409   auto A = __builtin_offsetof(S,A);
410   // CHECK: store i{{.+}} 0, ptr %{{.+}}
411   auto B = __builtin_offsetof(S,B);
412   // LIN64: store i{{.+}} 8, ptr %{{.+}}
413   // LIN32: store i{{.+}} 4, ptr %{{.+}}
414   // WIN: store i{{.+}} 8, ptr %{{.+}}
415   auto C = __builtin_offsetof(S,C);
416   // LIN64: store i{{.+}} 24, ptr %{{.+}}
417   // LIN32: store i{{.+}} 20, ptr %{{.+}}
418   // WIN: store i{{.+}} 24, ptr %{{.+}}
419   auto D = __builtin_offsetof(S,D);
420   // LIN64: store i64 32, ptr %{{.+}}
421   // LIN32: store i32 24, ptr %{{.+}}
422   // WIN: store i{{.+}} 32, ptr %{{.+}}
423   auto E = __builtin_offsetof(S,E);
424   // LIN64: store i64 64, ptr %{{.+}}
425   // LIN32: store i32 32, ptr %{{.+}}
426   // WIN: store i{{.+}} 64, ptr %{{.+}}
427 }
428 
429 
430 void ShiftBitIntByConstant(_BitInt(28) Ext) {
431 // LIN: define{{.*}} void @_Z21ShiftBitIntByConstantDB28_
432 // WIN: define dso_local void @"?ShiftBitIntByConstant@@YAXU?$_BitInt@$0BM@@__clang@@@Z"
433   Ext << 7;
434   // CHECK: shl i28 %{{.+}}, 7
435   Ext >> 7;
436   // CHECK: ashr i28 %{{.+}}, 7
437   Ext << -7;
438   // CHECK: shl i28 %{{.+}}, -7
439   Ext >> -7;
440   // CHECK: ashr i28 %{{.+}}, -7
441 
442   // UB in C/C++, Defined in OpenCL.
443   Ext << 29;
444   // CHECK: shl i28 %{{.+}}, 29
445   Ext >> 29;
446   // CHECK: ashr i28 %{{.+}}, 29
447 }
448 void ShiftBitIntByConstant(uint16_t4 Ext) {
449 // LIN64: define{{.*}} void @_Z21ShiftBitIntByConstantDv4_DU16_(double %
450 // LIN32: define dso_local void @_Z21ShiftBitIntByConstantDv4_DU16_(i64 %
451 // WIN: define dso_local void @"?ShiftBitIntByConstant@@YAXT?$__vector@U?$_UBitInt@$0BA@@__clang@@$03@__clang@@@Z"(<4 x i16>
452   Ext << 7;
453   // CHECK: shl <4 x i16> %{{.+}}, splat (i16 7)
454   Ext >> 7;
455   // CHECK: lshr <4 x i16> %{{.+}}, splat (i16 7)
456   Ext << -7;
457   // CHECK: shl <4 x i16> %{{.+}}, splat (i16 -7)
458   Ext >> -7;
459   // CHECK: lshr <4 x i16> %{{.+}}, splat (i16 -7)
460 
461   // UB in C/C++, Defined in OpenCL.
462   Ext << 29;
463   // CHECK: shl <4 x i16> %{{.+}}, splat (i16 29)
464   Ext >> 29;
465   // CHECK: lshr <4 x i16> %{{.+}}, splat (i16 29)
466 }
467 void ShiftBitIntByConstant(vint32_t8 Ext) {
468 // LIN64: define{{.*}} void @_Z21ShiftBitIntByConstantDv8_DB32_(ptr byval(<8 x i32>) align 32 %
469 // LIN32: define dso_local void @_Z21ShiftBitIntByConstantDv8_DB32_(<8 x i32> %
470 // WIN: define dso_local void @"?ShiftBitIntByConstant@@YAXT?$__vector@U?$_BitInt@$0CA@@__clang@@$07@__clang@@@Z"(<8 x i32>
471   Ext << 7;
472   // CHECK: shl <8 x i32> %{{.+}}, splat (i32 7)
473   Ext >> 7;
474   // CHECK: ashr <8 x i32> %{{.+}}, splat (i32 7)
475   Ext << -7;
476   // CHECK: shl <8 x i32> %{{.+}}, splat (i32 -7)
477   Ext >> -7;
478   // CHECK: ashr <8 x i32> %{{.+}}, splat (i32 -7)
479 
480   // UB in C/C++, Defined in OpenCL.
481   Ext << 29;
482   // CHECK: shl <8 x i32> %{{.+}}, splat (i32 29)
483   Ext >> 29;
484   // CHECK: ashr <8 x i32> %{{.+}}, splat (i32 29)
485 }
486 
487 void ConstantShiftByBitInt(_BitInt(28) Ext, _BitInt(65) LargeExt) {
488   // LIN: define{{.*}} void @_Z21ConstantShiftByBitIntDB28_DB65_
489   // WIN: define dso_local void @"?ConstantShiftByBitInt@@YAXU?$_BitInt@$0BM@@__clang@@U?$_BitInt@$0EB@@2@@Z"
490   10 << Ext;
491   // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i32
492   // CHECK: shl i32 10, %[[PROMO]]
493   10 >> Ext;
494   // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i32
495   // CHECK: ashr i32 10, %[[PROMO]]
496   10 << LargeExt;
497   // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i32
498   // CHECK: shl i32 10, %[[PROMO]]
499   10 >> LargeExt;
500   // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i32
501   // CHECK: ashr i32 10, %[[PROMO]]
502 }
503 
504 void Shift(_BitInt(28) Ext, _BitInt(65) LargeExt, int i) {
505   // LIN: define{{.*}} void @_Z5ShiftDB28_DB65_
506   // WIN: define dso_local void @"?Shift@@YAXU?$_BitInt@$0BM@@__clang@@U?$_BitInt@$0EB@@2@H@Z"
507   i << Ext;
508   // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i32
509   // CHECK: shl i32 {{.+}}, %[[PROMO]]
510   i >> Ext;
511   // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i32
512   // CHECK: ashr i32 {{.+}}, %[[PROMO]]
513 
514   i << LargeExt;
515   // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i32
516   // CHECK: shl i32 {{.+}}, %[[PROMO]]
517   i >> LargeExt;
518   // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i32
519   // CHECK: ashr i32 {{.+}}, %[[PROMO]]
520 
521   Ext << i;
522   // CHECK: %[[BI:.+]] = trunc i32 %{{.+}} to i28
523   // CHECK: %[[PROMO:.+]] = trunc i32 %{{.+}} to i28
524   // CHECK: shl i28 %[[BI]], %[[PROMO]]
525   Ext >> i;
526   // CHECK: %[[BI:.+]] = trunc i32 %{{.+}} to i28
527   // CHECK: %[[PROMO:.+]] = trunc i32 %{{.+}} to i28
528   // CHECK: ashr i28 %[[BI]], %[[PROMO]]
529 
530   LargeExt << i;
531   // CHECK: %[[PROMO:.+]] = zext i32 %{{.+}} to i65
532   // CHECK: shl i65 {{.+}}, %[[PROMO]]
533   LargeExt >> i;
534   // CHECK: %[[PROMO:.+]] = zext i32 %{{.+}} to i65
535   // CHECK: ashr i65 {{.+}}, %[[PROMO]]
536 
537   Ext << LargeExt;
538   // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i28
539   // CHECK: shl i28 {{.+}}, %[[PROMO]]
540   Ext >> LargeExt;
541   // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i28
542   // CHECK: ashr i28 {{.+}}, %[[PROMO]]
543 
544   LargeExt << Ext;
545   // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i65
546   // CHECK: shl i65 {{.+}}, %[[PROMO]]
547   LargeExt >> Ext;
548   // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i65
549   // CHECK: ashr i65 {{.+}}, %[[PROMO]]
550 }
551 
552 typedef  _BitInt(64) vint64_t16 __attribute__((vector_size(16)));
553 void VectorTest(vint64_t16 first, vint64_t16 second) {
554   // LIN: define{{.*}} void @_Z10VectorTestDv2_DB64_S0_(<2 x i64> %{{.+}}, <2 x i64> %{{.+}})
555   // WIN64: define dso_local void @"?VectorTest@@YAXT?$__vector@U?$_BitInt@$0EA@@__clang@@$01@__clang@@0@Z"(<2 x i64> %{{.+}}, <2 x i64> %{{.+}})
556   // WIN32: define dso_local void @"?VectorTest@@YAXT?$__vector@U?$_BitInt@$0EA@@__clang@@$01@__clang@@0@Z"(<2 x i64> inreg %{{.+}}, <2 x i64> inreg %{{.+}})
557   __builtin_shufflevector (first, first, 1, 3, 2) + __builtin_shufflevector (second, second, 1, 3, 2);
558   // CHECK: %[[Shuffle:.+]] = shufflevector <2 x i64> %{{.+}}, <2 x i64> %{{.+}}, <3 x i32> <i32 1, i32 3, i32 2>
559   // CHECK:  %[[Shuffle1:.+]] = shufflevector <2 x i64> %{{.+}}, <2 x i64> %{{.+}}, <3 x i32> <i32 1, i32 3, i32 2>
560   // CHECK: %[[ADD:.+]] = add <3 x i64> %[[Shuffle]], %[[Shuffle1]]
561 }
562 
563 void VectorTest(uint16_t4 first, uint16_t4 second) {
564   // LIN64: define{{.*}} void @_Z10VectorTestDv4_DU16_S0_(double %{{.+}}, double %{{.+}})
565   // LIN32: define{{.*}} void @_Z10VectorTestDv4_DU16_S0_(i64 %{{.+}}, i64 %{{.+}})
566   // WIN64: define dso_local void @"?VectorTest@@YAXT?$__vector@U?$_UBitInt@$0BA@@__clang@@$03@__clang@@0@Z"(<4 x i16> %{{.+}}, <4 x i16> %{{.+}})
567   // WIN32: define dso_local void @"?VectorTest@@YAXT?$__vector@U?$_UBitInt@$0BA@@__clang@@$03@__clang@@0@Z"(<4 x i16> inreg %{{.+}}, <4 x i16> inreg %{{.+}})
568   first.xzw + second.zwx;
569   // CHECK: %[[Shuffle:.+]] = shufflevector <4 x i16> %{{.+}}, <4 x i16> poison, <3 x i32> <i32 0, i32 2, i32 3>
570   // CHECK: %[[Shuffle1:.+]] = shufflevector <4 x i16> %{{.+}}, <4 x i16> poison, <3 x i32> <i32 2, i32 3, i32 0>
571   // CHECK: %[[ADD:.+]] = add <3 x i16> %[[Shuffle]], %[[Shuffle1]]
572 }
573 
574 // Ensure that these types don't alias the normal int types.
575 void TBAATest(_BitInt(sizeof(int) * 8) ExtInt,
576               unsigned _BitInt(sizeof(int) * 8) ExtUInt,
577               _BitInt(6) Other) {
578   // CHECK-DAG: store i32 %{{.+}}, ptr %{{.+}}, align 4, !tbaa ![[EXTINT_TBAA:.+]]
579   // CHECK-DAG: store i32 %{{.+}}, ptr %{{.+}}, align 4, !tbaa ![[EXTINT_TBAA]]
580   // CHECK-DAG: store i8 %{{.+}}, ptr %{{.+}}, align 1, !tbaa ![[EXTINT6_TBAA:.+]]
581   ExtInt = 5;
582   ExtUInt = 5;
583   Other = 5;
584 }
585 
586 // NoNewStructPathTBAA-DAG: ![[CHAR_TBAA_ROOT:.+]] = !{!"omnipotent char", ![[TBAA_ROOT:.+]], i64 0}
587 // NoNewStructPathTBAA-DAG: ![[TBAA_ROOT]] = !{!"Simple C++ TBAA"}
588 // NoNewStructPathTBAA-DAG: ![[EXTINT_TBAA]] = !{![[EXTINT_TBAA_ROOT:.+]], ![[EXTINT_TBAA_ROOT]], i64 0}
589 // NoNewStructPathTBAA-DAG: ![[EXTINT_TBAA_ROOT]] = !{!"_BitInt(32)", ![[CHAR_TBAA_ROOT]], i64 0}
590 // NoNewStructPathTBAA-DAG: ![[EXTINT6_TBAA]] = !{![[EXTINT6_TBAA_ROOT:.+]], ![[EXTINT6_TBAA_ROOT]], i64 0}
591 // NoNewStructPathTBAA-DAG: ![[EXTINT6_TBAA_ROOT]] = !{!"_BitInt(6)", ![[CHAR_TBAA_ROOT]], i64 0}
592 
593 // NewStructPathTBAA-DAG: ![[CHAR_TBAA_ROOT:.+]] = !{![[TBAA_ROOT:.+]], i64 1, !"omnipotent char"}
594 // NewStructPathTBAA-DAG: ![[TBAA_ROOT]] = !{!"Simple C++ TBAA"}
595 // NewStructPathTBAA-DAG: ![[EXTINT_TBAA]] = !{![[EXTINT_TBAA_ROOT:.+]], ![[EXTINT_TBAA_ROOT]], i64 0, i64 4}
596 // NewStructPathTBAA-DAG: ![[EXTINT_TBAA_ROOT]] = !{![[CHAR_TBAA_ROOT]], i64 4, !"_BitInt(32)"}
597 // NewStructPathTBAA-DAG: ![[EXTINT6_TBAA]] = !{![[EXTINT6_TBAA_ROOT:.+]], ![[EXTINT6_TBAA_ROOT]], i64 0, i64 1}
598 // NewStructPathTBAA-DAG: ![[EXTINT6_TBAA_ROOT]] = !{![[CHAR_TBAA_ROOT]], i64 1, !"_BitInt(6)"}
599 
600 namespace A {
601 template <int N> struct S {
602   using T = _BitInt(N);
603   T Data;
604 };
605 template <int N> void foo(S<N> B) {
606   const auto Var = B.Data;
607 }
608 
609 void bar() {
610   S<2080> a;
611   foo(a);
612 }
613 }
614