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.
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 
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 
100 void UnderlyingTypeUsage(AsEnumUnderlyingType Param) {
101   // LIN: define void @_Z19UnderlyingTypeUsage20AsEnumUnderlyingType(i9 %
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 i33 @_Z20ManglingTestRetParamU7_ExtIntILi33EEj(i33 %
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 i33 @_Z20ManglingTestRetParamU7_ExtIntILi33EEi(i33 %
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 
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 
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 2
159   // LIN: %[[OFA1:.+]] = load i8*, i8** %[[OFA_P1]]
160   // LIN: %[[BC1:.+]] = bitcast i8* %[[OFA1]] to i92*
161   // LIN: %[[OFANEXT1:.+]] = getelementptr i8, i8* %[[OFA1]], i32 16
162   // LIN: store i8* %[[OFANEXT1]], i8** %[[OFA_P1]]
163   // LIN: %[[LOAD1:.+]] = load i92, i92* %[[BC1]]
164   // LIN: store i92 %[[LOAD1]], i92*
165   // WIN: %[[CUR1:.+]] = load i8*, i8** %[[ARGS]]
166   // WIN: %[[NEXT1:.+]] = getelementptr inbounds i8, i8* %[[CUR1]], i64 16
167   // WIN: store i8* %[[NEXT1]], i8** %[[ARGS]]
168   // WIN: %[[BC1:.+]] = bitcast i8* %[[CUR1]] to i92*
169   // WIN: %[[LOADV1:.+]] = load i92, i92* %[[BC1]]
170   // WIN: store i92 %[[LOADV1]], i92*
171 
172   _ExtInt(31) B = __builtin_va_arg(args, _ExtInt(31));
173   // LIN: %[[AD2:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]]
174   // LIN: %[[OFA_P2:.+]] = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %[[AD2]], i32 0, i32 2
175   // LIN: %[[OFA2:.+]] = load i8*, i8** %[[OFA_P2]]
176   // LIN: %[[BC2:.+]] = bitcast i8* %[[OFA2]] to i31*
177   // LIN: %[[OFANEXT2:.+]] = getelementptr i8, i8* %[[OFA2]], i32 8
178   // LIN: store i8* %[[OFANEXT2]], i8** %[[OFA_P2]]
179   // LIN: %[[LOAD2:.+]] = load i31, i31* %[[BC2]]
180   // LIN: store i31 %[[LOAD2]], i31*
181   // WIN: %[[CUR2:.+]] = load i8*, i8** %[[ARGS]]
182   // WIN: %[[NEXT2:.+]] = getelementptr inbounds i8, i8* %[[CUR2]], i64 8
183   // WIN: store i8* %[[NEXT2]], i8** %[[ARGS]]
184   // WIN: %[[BC2:.+]] = bitcast i8* %[[CUR2]] to i31*
185   // WIN: %[[LOADV2:.+]] = load i31, i31* %[[BC2]]
186   // WIN: store i31 %[[LOADV2]], i31*
187 
188   _ExtInt(16) C = __builtin_va_arg(args, _ExtInt(16));
189   // LIN: %[[AD3:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]]
190   // LIN: %[[OFA_P3:.+]] = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %[[AD3]], i32 0, i32 2
191   // LIN: %[[OFA3:.+]] = load i8*, i8** %[[OFA_P3]]
192   // LIN: %[[BC3:.+]] = bitcast i8* %[[OFA3]] to i16*
193   // LIN: %[[OFANEXT3:.+]] = getelementptr i8, i8* %[[OFA3]], i32 8
194   // LIN: store i8* %[[OFANEXT3]], i8** %[[OFA_P3]]
195   // LIN: %[[LOAD3:.+]] = load i16, i16* %[[BC3]]
196   // LIN: store i16 %[[LOAD3]], i16*
197   // WIN: %[[CUR3:.+]] = load i8*, i8** %[[ARGS]]
198   // WIN: %[[NEXT3:.+]] = getelementptr inbounds i8, i8* %[[CUR3]], i64 8
199   // WIN: store i8* %[[NEXT3]], i8** %[[ARGS]]
200   // WIN: %[[BC3:.+]] = bitcast i8* %[[CUR3]] to i16*
201   // WIN: %[[LOADV3:.+]] = load i16, i16* %[[BC3]]
202   // WIN: store i16 %[[LOADV3]], i16*
203 
204   _ExtInt(129) D = __builtin_va_arg(args, _ExtInt(129));
205   // LIN: %[[AD4:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]]
206   // LIN: %[[OFA_P4:.+]] = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %[[AD4]], i32 0, i32 2
207   // LIN: %[[OFA4:.+]] = load i8*, i8** %[[OFA_P4]]
208   // LIN: %[[BC4:.+]] = bitcast i8* %[[OFA4]] to i129*
209   // LIN: %[[OFANEXT4:.+]] = getelementptr i8, i8* %[[OFA4]], i32 24
210   // LIN: store i8* %[[OFANEXT4]], i8** %[[OFA_P4]]
211   // LIN: %[[LOAD4:.+]] = load i129, i129* %[[BC4]]
212   // LIN: store i129 %[[LOAD4]], i129*
213   // WIN: %[[CUR4:.+]] = load i8*, i8** %[[ARGS]]
214   // WIN: %[[NEXT4:.+]] = getelementptr inbounds i8, i8* %[[CUR4]], i64 24
215   // WIN: store i8* %[[NEXT4]], i8** %[[ARGS]]
216   // WIN: %[[BC4:.+]] = bitcast i8* %[[CUR4]] to i129*
217   // WIN: %[[LOADV4:.+]] = load i129, i129* %[[BC4]]
218   // WIN: store i129 %[[LOADV4]], i129*
219 
220   _ExtInt(16777200) E = __builtin_va_arg(args, _ExtInt(16777200));
221   // LIN: %[[AD5:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]]
222   // LIN: %[[OFA_P5:.+]] = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %[[AD5]], i32 0, i32 2
223   // LIN: %[[OFA5:.+]] = load i8*, i8** %[[OFA_P5]]
224   // LIN: %[[BC5:.+]] = bitcast i8* %[[OFA5]] to i16777200*
225   // LIN: %[[OFANEXT5:.+]] = getelementptr i8, i8* %[[OFA5]], i32 2097152
226   // LIN: store i8* %[[OFANEXT5]], i8** %[[OFA_P5]]
227   // LIN: %[[LOAD5:.+]] = load i16777200, i16777200* %[[BC5]]
228   // LIN: store i16777200 %[[LOAD5]], i16777200*
229   // WIN: %[[CUR5:.+]] = load i8*, i8** %[[ARGS]]
230   // WIN: %[[NEXT5:.+]] = getelementptr inbounds i8, i8* %[[CUR5]], i64 2097152
231   // WIN: store i8* %[[NEXT5]], i8** %[[ARGS]]
232   // WIN: %[[BC5:.+]] = bitcast i8* %[[CUR5]] to i16777200*
233   // WIN: %[[LOADV5:.+]] = load i16777200, i16777200* %[[BC5]]
234   // WIN: store i16777200 %[[LOADV5]], i16777200*
235 
236   __builtin_va_end(args);
237   // LIN: %[[ENDAD:.+]] = getelementptr inbounds [1 x %struct.__va_list_tag], [1 x %struct.__va_list_tag]* %[[ARGS]]
238   // LIN: %[[ENDAD1:.+]] = bitcast %struct.__va_list_tag* %[[ENDAD]] to i8*
239   // LIN: call void @llvm.va_end(i8* %[[ENDAD1]])
240   // WIN: %[[ARGSEND:.+]] = bitcast i8** %[[ARGS]] to i8*
241   // WIN: call void @llvm.va_end(i8* %[[ARGSEND]])
242 }
243 void typeid_tests() {
244   // LIN: define void @_Z12typeid_testsv()
245   // WIN: define dso_local void @"?typeid_tests@@YAXXZ"()
246   unsigned _ExtInt(33) U33_1, U33_2;
247   _ExtInt(33) S33_1, S33_2;
248   _ExtInt(32) S32_1, S32_2;
249 
250  auto A = typeid(U33_1);
251  // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* %{{.+}}, %"class.std::type_info"* dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi33EEj to %"class.std::type_info"*))
252  // WIN: call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* %{{.+}}, %"class.std::type_info"* dereferenceable(16) bitcast (%rtti.TypeDescriptor28* @"??_R0U?$_UExtInt@$0CB@@__clang@@@8" to %"class.std::type_info"*))
253  auto B = typeid(U33_2);
254  // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* %{{.+}}, %"class.std::type_info"* dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi33EEj to %"class.std::type_info"*))
255  // WIN:  call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* %{{.+}}, %"class.std::type_info"* dereferenceable(16) bitcast (%rtti.TypeDescriptor28* @"??_R0U?$_UExtInt@$0CB@@__clang@@@8" to %"class.std::type_info"*))
256  auto C = typeid(S33_1);
257  // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* %{{.+}}, %"class.std::type_info"* dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi33EEi to %"class.std::type_info"*))
258  // WIN:  call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* %{{.+}}, %"class.std::type_info"* dereferenceable(16) bitcast (%rtti.TypeDescriptor27* @"??_R0U?$_ExtInt@$0CB@@__clang@@@8" to %"class.std::type_info"*))
259  auto D = typeid(S33_2);
260  // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* %{{.+}}, %"class.std::type_info"* dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi33EEi to %"class.std::type_info"*))
261  // WIN:  call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* %{{.+}}, %"class.std::type_info"* dereferenceable(16) bitcast (%rtti.TypeDescriptor27* @"??_R0U?$_ExtInt@$0CB@@__clang@@@8" to %"class.std::type_info"*))
262  auto E = typeid(S32_1);
263  // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* %{{.+}}, %"class.std::type_info"* dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi32EEi to %"class.std::type_info"*))
264  // WIN:  call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* %{{.+}}, %"class.std::type_info"* dereferenceable(16) bitcast (%rtti.TypeDescriptor27* @"??_R0U?$_ExtInt@$0CA@@__clang@@@8" to %"class.std::type_info"*))
265  auto F = typeid(S32_2);
266  // LIN: call void @_ZNSt9type_infoC1ERKS_(%"class.std::type_info"* %{{.+}}, %"class.std::type_info"* dereferenceable(16) bitcast ({ i8*, i8* }* @_ZTIU7_ExtIntILi32EEi to %"class.std::type_info"*))
267  // WIN:  call %"class.std::type_info"* @"??0type_info@std@@QEAA@AEBV01@@Z"(%"class.std::type_info"* %{{.+}}, %"class.std::type_info"* dereferenceable(16) bitcast (%rtti.TypeDescriptor27* @"??_R0U?$_ExtInt@$0CA@@__clang@@@8" to %"class.std::type_info"*))
268 }
269 
270 void ExplicitCasts() {
271   // LIN: define void @_Z13ExplicitCastsv()
272   // WIN: define dso_local void @"?ExplicitCasts@@YAXXZ"()
273 
274   _ExtInt(33) a;
275   _ExtInt(31) b;
276   int i;
277 
278   a = i;
279   // CHECK: %[[CONV:.+]] = sext i32 %{{.+}} to i33
280   b = i;
281   // CHECK: %[[CONV:.+]] = trunc i32 %{{.+}} to i31
282   i = a;
283   // CHECK: %[[CONV:.+]] = trunc i33 %{{.+}} to i32
284   i = b;
285   // CHECK: %[[CONV:.+]] = sext i31 %{{.+}} to i32
286 }
287 
288 struct S {
289   _ExtInt(17) A;
290   _ExtInt(16777200) B;
291   _ExtInt(17) C;
292 };
293 
294 void OffsetOfTest() {
295   // LIN: define void @_Z12OffsetOfTestv()
296   // WIN: define dso_local void @"?OffsetOfTest@@YAXXZ"()
297 
298   auto A = __builtin_offsetof(S,A);
299   // CHECK: store i64 0, i64* %{{.+}}
300   auto B = __builtin_offsetof(S,B);
301   // CHECK: store i64 8, i64* %{{.+}}
302   auto C = __builtin_offsetof(S,C);
303   // CHECK: store i64 2097160, i64* %{{.+}}
304 }
305 
306 
307 void ShiftExtIntByConstant(_ExtInt(28) Ext) {
308 // LIN: define void @_Z21ShiftExtIntByConstantU7_ExtIntILi28EEi
309 // WIN: define dso_local void @"?ShiftExtIntByConstant@@YAXU?$_ExtInt@$0BM@@__clang@@@Z"
310   Ext << 7;
311   // CHECK: shl i28 %{{.+}}, 7
312   Ext >> 7;
313   // CHECK: ashr i28 %{{.+}}, 7
314   Ext << -7;
315   // CHECK: shl i28 %{{.+}}, -7
316   Ext >> -7;
317   // CHECK: ashr i28 %{{.+}}, -7
318 
319   // UB in C/C++, Defined in OpenCL.
320   Ext << 29;
321   // CHECK: shl i28 %{{.+}}, 29
322   Ext >> 29;
323   // CHECK: ashr i28 %{{.+}}, 29
324 }
325 
326 void ConstantShiftByExtInt(_ExtInt(28) Ext, _ExtInt(65) LargeExt) {
327   // LIN: define void @_Z21ConstantShiftByExtIntU7_ExtIntILi28EEiU7_ExtIntILi65EEi
328   // WIN: define dso_local void @"?ConstantShiftByExtInt@@YAXU?$_ExtInt@$0BM@@__clang@@U?$_ExtInt@$0EB@@2@@Z"
329   10 << Ext;
330   // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i32
331   // CHECK: shl i32 10, %[[PROMO]]
332   10 >> Ext;
333   // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i32
334   // CHECK: ashr i32 10, %[[PROMO]]
335   10 << LargeExt;
336   // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i32
337   // CHECK: shl i32 10, %[[PROMO]]
338   10 >> LargeExt;
339   // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i32
340   // CHECK: ashr i32 10, %[[PROMO]]
341 }
342 
343 void Shift(_ExtInt(28) Ext, _ExtInt(65) LargeExt, int i) {
344   // LIN: define void @_Z5ShiftU7_ExtIntILi28EEiU7_ExtIntILi65EEii
345   // WIN: define dso_local void @"?Shift@@YAXU?$_ExtInt@$0BM@@__clang@@U?$_ExtInt@$0EB@@2@H@Z"
346   i << Ext;
347   // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i32
348   // CHECK: shl i32 {{.+}}, %[[PROMO]]
349   i >> Ext;
350   // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i32
351   // CHECK: ashr i32 {{.+}}, %[[PROMO]]
352 
353   i << LargeExt;
354   // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i32
355   // CHECK: shl i32 {{.+}}, %[[PROMO]]
356   i >> LargeExt;
357   // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i32
358   // CHECK: ashr i32 {{.+}}, %[[PROMO]]
359 
360   Ext << i;
361   // CHECK: %[[PROMO:.+]] = trunc i32 %{{.+}} to i28
362   // CHECK: shl i28 {{.+}}, %[[PROMO]]
363   Ext >> i;
364   // CHECK: %[[PROMO:.+]] = trunc i32 %{{.+}} to i28
365   // CHECK: ashr i28 {{.+}}, %[[PROMO]]
366 
367   LargeExt << i;
368   // CHECK: %[[PROMO:.+]] = zext i32 %{{.+}} to i65
369   // CHECK: shl i65 {{.+}}, %[[PROMO]]
370   LargeExt >> i;
371   // CHECK: %[[PROMO:.+]] = zext i32 %{{.+}} to i65
372   // CHECK: ashr i65 {{.+}}, %[[PROMO]]
373 
374   Ext << LargeExt;
375   // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i28
376   // CHECK: shl i28 {{.+}}, %[[PROMO]]
377   Ext >> LargeExt;
378   // CHECK: %[[PROMO:.+]] = trunc i65 %{{.+}} to i28
379   // CHECK: ashr i28 {{.+}}, %[[PROMO]]
380 
381   LargeExt << Ext;
382   // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i65
383   // CHECK: shl i65 {{.+}}, %[[PROMO]]
384   LargeExt >> Ext;
385   // CHECK: %[[PROMO:.+]] = zext i28 %{{.+}} to i65
386   // CHECK: ashr i65 {{.+}}, %[[PROMO]]
387 }
388 
389 void ComplexTest(_Complex _ExtInt(12) first,
390                                  _Complex _ExtInt(33) second) {
391   // LIN: define void @_Z11ComplexTestCU7_ExtIntILi12EEiCU7_ExtIntILi33EEi
392   // WIN: define dso_local void  @"?ComplexTest@@YAXU?$_Complex@U?$_ExtInt@$0M@@__clang@@@__clang@@U?$_Complex@U?$_ExtInt@$0CB@@__clang@@@2@@Z"
393   first + second;
394   // CHECK: %[[FIRST_REALP:.+]] = getelementptr inbounds { i12, i12 }, { i12, i12 }* %{{.+}}, i32 0, i32 0
395   // CHECK: %[[FIRST_REAL:.+]] = load i12, i12* %[[FIRST_REALP]]
396   // CHECK: %[[FIRST_IMAGP:.+]] = getelementptr inbounds { i12, i12 }, { i12, i12 }* %{{.+}}, i32 0, i32 1
397   // CHECK: %[[FIRST_IMAG:.+]] = load i12, i12* %[[FIRST_IMAGP]]
398   // CHECK: %[[FIRST_REAL_CONV:.+]] = sext i12 %[[FIRST_REAL]]
399   // CHECK: %[[FIRST_IMAG_CONV:.+]] = sext i12 %[[FIRST_IMAG]]
400   // CHECK: %[[SECOND_REALP:.+]] = getelementptr inbounds { i33, i33 }, { i33, i33 }* %{{.+}}, i32 0, i32 0
401   // CHECK: %[[SECOND_REAL:.+]] = load i33, i33* %[[SECOND_REALP]]
402   // CHECK: %[[SECOND_IMAGP:.+]] = getelementptr inbounds { i33, i33 }, { i33, i33 }* %{{.+}}, i32 0, i32 1
403   // CHECK: %[[SECOND_IMAG:.+]] = load i33, i33* %[[SECOND_IMAGP]]
404   // CHECK: %[[REAL:.+]] = add i33 %[[FIRST_REAL_CONV]], %[[SECOND_REAL]]
405   // CHECK: %[[IMAG:.+]] = add i33 %[[FIRST_IMAG_CONV]], %[[SECOND_IMAG]]
406 }
407 
408 // Ensure that these types don't alias the normal int types.
409 void TBAATest(_ExtInt(sizeof(int) * 8) ExtInt,
410               unsigned _ExtInt(sizeof(int) * 8) ExtUInt,
411               _ExtInt(6) Other) {
412   // CHECK-DAG: store i32 %{{.+}}, i32* %{{.+}}, align 4, !tbaa ![[EXTINT_TBAA:.+]]
413   // CHECK-DAG: store i32 %{{.+}}, i32* %{{.+}}, align 4, !tbaa ![[EXTINT_TBAA]]
414   // CHECK-DAG: store i6 %{{.+}}, i6* %{{.+}}, align 1, !tbaa ![[EXTINT6_TBAA:.+]]
415   ExtInt = 5;
416   ExtUInt = 5;
417   Other = 5;
418 }
419 
420 // NoNewStructPathTBAA-DAG: ![[CHAR_TBAA_ROOT:.+]] = !{!"omnipotent char", ![[TBAA_ROOT:.+]], i64 0}
421 // NoNewStructPathTBAA-DAG: ![[TBAA_ROOT]] = !{!"Simple C++ TBAA"}
422 // NoNewStructPathTBAA-DAG: ![[EXTINT_TBAA]] = !{![[EXTINT_TBAA_ROOT:.+]], ![[EXTINT_TBAA_ROOT]], i64 0}
423 // NoNewStructPathTBAA-DAG: ![[EXTINT_TBAA_ROOT]] = !{!"_ExtInt(32)", ![[CHAR_TBAA_ROOT]], i64 0}
424 // NoNewStructPathTBAA-DAG: ![[EXTINT6_TBAA]] = !{![[EXTINT6_TBAA_ROOT:.+]], ![[EXTINT6_TBAA_ROOT]], i64 0}
425 // NoNewStructPathTBAA-DAG: ![[EXTINT6_TBAA_ROOT]] = !{!"_ExtInt(6)", ![[CHAR_TBAA_ROOT]], i64 0}
426 
427 // NewStructPathTBAA-DAG: ![[CHAR_TBAA_ROOT:.+]] = !{![[TBAA_ROOT:.+]], i64 1, !"omnipotent char"}
428 // NewStructPathTBAA-DAG: ![[TBAA_ROOT]] = !{!"Simple C++ TBAA"}
429 // NewStructPathTBAA-DAG: ![[EXTINT_TBAA]] = !{![[EXTINT_TBAA_ROOT:.+]], ![[EXTINT_TBAA_ROOT]], i64 0, i64 4}
430 // NewStructPathTBAA-DAG: ![[EXTINT_TBAA_ROOT]] = !{![[CHAR_TBAA_ROOT]], i64 4, !"_ExtInt(32)"}
431 // NewStructPathTBAA-DAG: ![[EXTINT6_TBAA]] = !{![[EXTINT6_TBAA_ROOT:.+]], ![[EXTINT6_TBAA_ROOT]], i64 0, i64 1}
432 // NewStructPathTBAA-DAG: ![[EXTINT6_TBAA_ROOT]] = !{![[CHAR_TBAA_ROOT]], i64 1, !"_ExtInt(6)"}
433