blob: f9fe986ef6b574ec6db202005f6702e432bb9f5c [file] [log] [blame]
JF Bastien1b222ce2018-08-07 04:03:03 +00001// RUN: %clang_cc1 -triple x86_64-unknown-unknown -fblocks %s -emit-llvm -o - | FileCheck %s
JF Bastienc70f65e2018-08-07 03:12:52 +00002
3template<typename T> void used(T &) noexcept;
4
5#define TEST_UNINIT(NAME, TYPE) \
6 using type_##NAME = TYPE; \
7 void test_##NAME##_uninit() { \
8 type_##NAME uninit; \
9 used(uninit); \
10 }
11
12// Value initialization on scalars, aggregate initialization on aggregates.
13#define TEST_BRACES(NAME, TYPE) \
14 using type_##NAME = TYPE; \
15 void test_##NAME##_braces() { \
16 type_##NAME braces = {}; \
17 used(braces); \
18 }
19
20#define TEST_CUSTOM(NAME, TYPE, ...) \
21 using type_##NAME = TYPE; \
22 void test_##NAME##_custom() { \
23 type_##NAME custom __VA_ARGS__; \
24 used(custom); \
25 }
26
27struct empty {};
28struct small { char c; };
29struct smallinit { char c = 42; };
30struct smallpartinit { char c = 42, d; };
31struct nullinit { char* null = nullptr; };
32struct padded { char c; int i; };
33struct paddednullinit { char c = 0; int i = 0; };
34struct bitfield { int i : 4; int j : 2; };
35struct bitfieldaligned { int i : 4; int : 0; int j : 2; };
36struct big { unsigned a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z; };
37struct arraytail { int i; int arr[]; };
38struct tailpad { short s; char c; };
39struct notlockfree { long long a[4]; };
40struct semivolatile { int i; volatile int vi; };
41struct semivolatileinit { int i = 0x11111111; volatile int vi = 0x11111111; };
42struct base { virtual ~base(); };
43struct derived : public base {};
44struct virtualderived : public virtual base, public virtual derived {};
45union matching { int i; float f; };
46union matchingreverse { float f; int i; };
47union unmatched { char c; int i; };
48union unmatchedreverse { int i; char c; };
49union unmatchedfp { float f; double d; };
50enum emptyenum {};
51enum smallenum { VALUE };
52
53extern "C" {
54
55TEST_UNINIT(char, char);
56// CHECK-LABEL: @test_char_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +000057// CHECK: %uninit = alloca i8, align
JF Bastienc70f65e2018-08-07 03:12:52 +000058// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
59
60TEST_BRACES(char, char);
61// CHECK-LABEL: @test_char_braces()
JF Bastiencc365c32018-08-07 22:43:44 +000062// CHECK: %braces = alloca i8, align [[ALIGN:[0-9]*]]
63// CHECK-NEXT: store i8 0, i8* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +000064// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
65
66TEST_UNINIT(uchar, unsigned char);
67// CHECK-LABEL: @test_uchar_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +000068// CHECK: %uninit = alloca i8, align
JF Bastienc70f65e2018-08-07 03:12:52 +000069// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
70
71TEST_BRACES(uchar, unsigned char);
72// CHECK-LABEL: @test_uchar_braces()
JF Bastiencc365c32018-08-07 22:43:44 +000073// CHECK: %braces = alloca i8, align [[ALIGN:[0-9]*]]
74// CHECK-NEXT: store i8 0, i8* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +000075// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
76
77TEST_UNINIT(schar, signed char);
78// CHECK-LABEL: @test_schar_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +000079// CHECK: %uninit = alloca i8, align
JF Bastienc70f65e2018-08-07 03:12:52 +000080// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
81
82TEST_BRACES(schar, signed char);
83// CHECK-LABEL: @test_schar_braces()
JF Bastiencc365c32018-08-07 22:43:44 +000084// CHECK: %braces = alloca i8, align [[ALIGN:[0-9]*]]
85// CHECK-NEXT: store i8 0, i8* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +000086// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
87
88TEST_UNINIT(wchar_t, wchar_t);
89// CHECK-LABEL: @test_wchar_t_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +000090// CHECK: %uninit = alloca i32, align
JF Bastienc70f65e2018-08-07 03:12:52 +000091// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
92
93TEST_BRACES(wchar_t, wchar_t);
94// CHECK-LABEL: @test_wchar_t_braces()
JF Bastiencc365c32018-08-07 22:43:44 +000095// CHECK: %braces = alloca i32, align [[ALIGN:[0-9]*]]
96// CHECK-NEXT: store i32 0, i32* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +000097// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
98
99TEST_UNINIT(short, short);
100// CHECK-LABEL: @test_short_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000101// CHECK: %uninit = alloca i16, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000102// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
103
104TEST_BRACES(short, short);
105// CHECK-LABEL: @test_short_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000106// CHECK: %braces = alloca i16, align [[ALIGN:[0-9]*]]
107// CHECK-NEXT: store i16 0, i16* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000108// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
109
110TEST_UNINIT(ushort, unsigned short);
111// CHECK-LABEL: @test_ushort_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000112// CHECK: %uninit = alloca i16, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000113// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
114
115TEST_BRACES(ushort, unsigned short);
116// CHECK-LABEL: @test_ushort_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000117// CHECK: %braces = alloca i16, align [[ALIGN:[0-9]*]]
118// CHECK-NEXT: store i16 0, i16* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000119// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
120
121TEST_UNINIT(int, int);
122// CHECK-LABEL: @test_int_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000123// CHECK: %uninit = alloca i32, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000124// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
125
126TEST_BRACES(int, int);
127// CHECK-LABEL: @test_int_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000128// CHECK: %braces = alloca i32, align [[ALIGN:[0-9]*]]
129// CHECK-NEXT: store i32 0, i32* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000130// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
131
132TEST_UNINIT(unsigned, unsigned);
133// CHECK-LABEL: @test_unsigned_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000134// CHECK: %uninit = alloca i32, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000135// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
136
137TEST_BRACES(unsigned, unsigned);
138// CHECK-LABEL: @test_unsigned_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000139// CHECK: %braces = alloca i32, align [[ALIGN:[0-9]*]]
140// CHECK-NEXT: store i32 0, i32* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000141// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
142
143TEST_UNINIT(long, long);
144// CHECK-LABEL: @test_long_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000145// CHECK: %uninit = alloca i64, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000146// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
147
148TEST_BRACES(long, long);
149// CHECK-LABEL: @test_long_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000150// CHECK: %braces = alloca i64, align [[ALIGN:[0-9]*]]
151// CHECK-NEXT: store i64 0, i64* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000152// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
153
154TEST_UNINIT(ulong, unsigned long);
155// CHECK-LABEL: @test_ulong_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000156// CHECK: %uninit = alloca i64, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000157// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
158
159TEST_BRACES(ulong, unsigned long);
160// CHECK-LABEL: @test_ulong_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000161// CHECK: %braces = alloca i64, align [[ALIGN:[0-9]*]]
162// CHECK-NEXT: store i64 0, i64* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000163// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
164
165TEST_UNINIT(longlong, long long);
166// CHECK-LABEL: @test_longlong_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000167// CHECK: %uninit = alloca i64, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000168// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
169
170TEST_BRACES(longlong, long long);
171// CHECK-LABEL: @test_longlong_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000172// CHECK: %braces = alloca i64, align [[ALIGN:[0-9]*]]
173// CHECK-NEXT: store i64 0, i64* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000174// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
175
176TEST_UNINIT(ulonglong, unsigned long long);
177// CHECK-LABEL: @test_ulonglong_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000178// CHECK: %uninit = alloca i64, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000179// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
180
181TEST_BRACES(ulonglong, unsigned long long);
182// CHECK-LABEL: @test_ulonglong_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000183// CHECK: %braces = alloca i64, align [[ALIGN:[0-9]*]]
184// CHECK-NEXT: store i64 0, i64* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000185// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
186
187TEST_UNINIT(int128, __int128);
188// CHECK-LABEL: @test_int128_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000189// CHECK: %uninit = alloca i128, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000190// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
191
192TEST_BRACES(int128, __int128);
193// CHECK-LABEL: @test_int128_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000194// CHECK: %braces = alloca i128, align [[ALIGN:[0-9]*]]
195// CHECK-NEXT: store i128 0, i128* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000196// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
197
198TEST_UNINIT(uint128, unsigned __int128);
199// CHECK-LABEL: @test_uint128_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000200// CHECK: %uninit = alloca i128, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000201// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
202
203TEST_BRACES(uint128, unsigned __int128);
204// CHECK-LABEL: @test_uint128_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000205// CHECK: %braces = alloca i128, align [[ALIGN:[0-9]*]]
206// CHECK-NEXT: store i128 0, i128* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000207// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
208
209
210TEST_UNINIT(fp16, __fp16);
211// CHECK-LABEL: @test_fp16_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000212// CHECK: %uninit = alloca half, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000213// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
214
215TEST_BRACES(fp16, __fp16);
216// CHECK-LABEL: @test_fp16_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000217// CHECK: %braces = alloca half, align [[ALIGN:[0-9]*]]
218// CHECK-NEXT: store half 0xH0000, half* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000219// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
220
221TEST_UNINIT(float, float);
222// CHECK-LABEL: @test_float_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000223// CHECK: %uninit = alloca float, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000224// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
225
226TEST_BRACES(float, float);
227// CHECK-LABEL: @test_float_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000228// CHECK: %braces = alloca float, align [[ALIGN:[0-9]*]]
229// CHECK-NEXT: store float 0.000000e+00, float* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000230// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
231
232TEST_UNINIT(double, double);
233// CHECK-LABEL: @test_double_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000234// CHECK: %uninit = alloca double, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000235// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
236
237TEST_BRACES(double, double);
238// CHECK-LABEL: @test_double_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000239// CHECK: %braces = alloca double, align [[ALIGN:[0-9]*]]
240// CHECK-NEXT: store double 0.000000e+00, double* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000241// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
242
243TEST_UNINIT(longdouble, long double);
244// CHECK-LABEL: @test_longdouble_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000245// CHECK: %uninit = alloca x86_fp80, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000246// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
247
248TEST_BRACES(longdouble, long double);
249// CHECK-LABEL: @test_longdouble_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000250// CHECK: %braces = alloca x86_fp80, align [[ALIGN:[0-9]*]]
251// CHECK-NEXT: store x86_fp80 0xK00000000000000000000, x86_fp80* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000252// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
253
254
255TEST_UNINIT(intptr, int*);
256// CHECK-LABEL: @test_intptr_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000257// CHECK: %uninit = alloca i32*, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000258// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
259
260TEST_BRACES(intptr, int*);
261// CHECK-LABEL: @test_intptr_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000262// CHECK: %braces = alloca i32*, align [[ALIGN:[0-9]*]]
263// CHECK-NEXT: store i32* null, i32** %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000264// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
265
266TEST_UNINIT(intptrptr, int**);
267// CHECK-LABEL: @test_intptrptr_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000268// CHECK: %uninit = alloca i32**, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000269// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
270
271TEST_BRACES(intptrptr, int**);
272// CHECK-LABEL: @test_intptrptr_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000273// CHECK: %braces = alloca i32**, align [[ALIGN:[0-9]*]]
274// CHECK-NEXT: store i32** null, i32*** %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000275// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
276
277TEST_UNINIT(function, void(*)());
278// CHECK-LABEL: @test_function_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000279// CHECK: %uninit = alloca void ()*, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000280// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
281
282TEST_BRACES(function, void(*)());
283// CHECK-LABEL: @test_function_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000284// CHECK: %braces = alloca void ()*, align [[ALIGN:[0-9]*]]
285// CHECK-NEXT: store void ()* null, void ()** %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000286// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
287
288TEST_UNINIT(bool, bool);
289// CHECK-LABEL: @test_bool_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000290// CHECK: %uninit = alloca i8, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000291// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
292
293TEST_BRACES(bool, bool);
294// CHECK-LABEL: @test_bool_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000295// CHECK: %braces = alloca i8, align [[ALIGN:[0-9]*]]
296// CHECK-NEXT: store i8 0, i8* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000297// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
298
299
300TEST_UNINIT(empty, empty);
301// CHECK-LABEL: @test_empty_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000302// CHECK: %uninit = alloca %struct.empty, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000303// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
304
305TEST_BRACES(empty, empty);
306// CHECK-LABEL: @test_empty_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000307// CHECK: %braces = alloca %struct.empty, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000308// CHECK-NEXT: bitcast
309// CHECK-NEXT: call void @llvm.memcpy
310// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
311
312TEST_UNINIT(small, small);
313// CHECK-LABEL: @test_small_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000314// CHECK: %uninit = alloca %struct.small, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000315// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
316
317TEST_BRACES(small, small);
318// CHECK-LABEL: @test_small_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000319// CHECK: %braces = alloca %struct.small, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000320// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000321// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 1, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000322// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
323
324 TEST_CUSTOM(small, small, { 42 });
325// CHECK-LABEL: @test_small_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000326// CHECK: %custom = alloca %struct.small, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000327// CHECK-NEXT: bitcast
328// CHECK-NEXT: call void @llvm.memcpy
329// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
330
331TEST_UNINIT(smallinit, smallinit);
332// CHECK-LABEL: @test_smallinit_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000333// CHECK: %uninit = alloca %struct.smallinit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000334// CHECK-NEXT: call void @{{.*}}smallinit{{.*}}%uninit)
335// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
336
337TEST_BRACES(smallinit, smallinit);
338// CHECK-LABEL: @test_smallinit_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000339// CHECK: %braces = alloca %struct.smallinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000340// CHECK-NEXT: %[[C:[^ ]*]] = getelementptr inbounds %struct.smallinit, %struct.smallinit* %braces, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000341// CHECK-NEXT: store i8 42, i8* %[[C]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000342// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
343
344TEST_CUSTOM(smallinit, smallinit, { 100 });
345// CHECK-LABEL: @test_smallinit_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000346// CHECK: %custom = alloca %struct.smallinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000347// CHECK-NEXT: %[[C:[^ ]*]] = getelementptr inbounds %struct.smallinit, %struct.smallinit* %custom, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000348// CHECK-NEXT: store i8 100, i8* %[[C]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000349// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
350
351TEST_UNINIT(smallpartinit, smallpartinit);
352// CHECK-LABEL: @test_smallpartinit_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000353// CHECK: %uninit = alloca %struct.smallpartinit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000354// CHECK-NEXT: call void @{{.*}}smallpartinit{{.*}}%uninit)
355// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
356
357TEST_BRACES(smallpartinit, smallpartinit);
358// CHECK-LABEL: @test_smallpartinit_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000359// CHECK: %braces = alloca %struct.smallpartinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000360// CHECK-NEXT: %[[C:[^ ]*]] = getelementptr inbounds %struct.smallpartinit, %struct.smallpartinit* %braces, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000361// CHECK-NEXT: store i8 42, i8* %[[C]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000362// CHECK-NEXT: %[[D:[^ ]*]] = getelementptr inbounds %struct.smallpartinit, %struct.smallpartinit* %braces, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +0000363// CHECK-NEXT: store i8 0, i8* %[[D]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000364// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
365
366TEST_CUSTOM(smallpartinit, smallpartinit, { 100, 42 });
367// CHECK-LABEL: @test_smallpartinit_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000368// CHECK: %custom = alloca %struct.smallpartinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000369// CHECK-NEXT: %[[C:[^ ]*]] = getelementptr inbounds %struct.smallpartinit, %struct.smallpartinit* %custom, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000370// CHECK-NEXT: store i8 100, i8* %[[C]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000371// CHECK-NEXT: %[[D:[^ ]*]] = getelementptr inbounds %struct.smallpartinit, %struct.smallpartinit* %custom, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +0000372// CHECK-NEXT: store i8 42, i8* %[[D]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000373// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
374
375TEST_UNINIT(nullinit, nullinit);
376// CHECK-LABEL: @test_nullinit_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000377// CHECK: %uninit = alloca %struct.nullinit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000378// CHECK-NEXT: call void @{{.*}}nullinit{{.*}}%uninit)
379// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
380
381TEST_BRACES(nullinit, nullinit);
382// CHECK-LABEL: @test_nullinit_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000383// CHECK: %braces = alloca %struct.nullinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000384// CHECK-NEXT: %[[N:[^ ]*]] = getelementptr inbounds %struct.nullinit, %struct.nullinit* %braces, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000385// CHECK-NEXT: store i8* null, i8** %[[N]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000386// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
387
388TEST_CUSTOM(nullinit, nullinit, { (char*)"derp" });
389// CHECK-LABEL: @test_nullinit_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000390// CHECK: %custom = alloca %struct.nullinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000391// CHECK-NEXT: %[[N:[^ ]*]] = getelementptr inbounds %struct.nullinit, %struct.nullinit* %custom, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000392// CHECK-NEXT: store i8* getelementptr inbounds {{.*}}, i8** %[[N]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000393// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
394
395TEST_UNINIT(padded, padded);
396// CHECK-LABEL: @test_padded_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000397// CHECK: %uninit = alloca %struct.padded, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000398// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
399
400TEST_BRACES(padded, padded);
401// CHECK-LABEL: @test_padded_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000402// CHECK: %braces = alloca %struct.padded, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000403// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000404// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 8, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000405// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
406
407TEST_CUSTOM(padded, padded, { 42, 13371337 });
408// CHECK-LABEL: @test_padded_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000409// CHECK: %custom = alloca %struct.padded, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000410// CHECK-NEXT: bitcast
411// CHECK-NEXT: call void @llvm.memcpy
412// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
413
414TEST_UNINIT(paddednullinit, paddednullinit);
415// CHECK-LABEL: @test_paddednullinit_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000416// CHECK: %uninit = alloca %struct.paddednullinit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000417// CHECK-NEXT: call void @{{.*}}paddednullinit{{.*}}%uninit)
418// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
419
420TEST_BRACES(paddednullinit, paddednullinit);
421// CHECK-LABEL: @test_paddednullinit_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000422// CHECK: %braces = alloca %struct.paddednullinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000423// CHECK-NEXT: %[[C:[^ ]*]] = getelementptr inbounds %struct.paddednullinit, %struct.paddednullinit* %braces, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000424// CHECK-NEXT: store i8 0, i8* %[[C]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000425// CHECK-NEXT: %[[I:[^ ]*]] = getelementptr inbounds %struct.paddednullinit, %struct.paddednullinit* %braces, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +0000426// CHECK-NEXT: store i32 0, i32* %[[I]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000427// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
428
429TEST_CUSTOM(paddednullinit, paddednullinit, { 42, 13371337 });
430// CHECK-LABEL: @test_paddednullinit_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000431// CHECK: %custom = alloca %struct.paddednullinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000432// CHECK-NEXT: %[[C:[^ ]*]] = getelementptr inbounds %struct.paddednullinit, %struct.paddednullinit* %custom, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000433// CHECK-NEXT: store i8 42, i8* %[[C]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000434// CHECK-NEXT: %[[I:[^ ]*]] = getelementptr inbounds %struct.paddednullinit, %struct.paddednullinit* %custom, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +0000435// CHECK-NEXT: store i32 13371337, i32* %[[I]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000436// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
437
438TEST_UNINIT(bitfield, bitfield);
439// CHECK-LABEL: @test_bitfield_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000440// CHECK: %uninit = alloca %struct.bitfield, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000441// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
442
443TEST_BRACES(bitfield, bitfield);
444// CHECK-LABEL: @test_bitfield_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000445// CHECK: %braces = alloca %struct.bitfield, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000446// CHECK-NEXT: bitcast
447// CHECK-NEXT: call void @llvm.memcpy
448// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
449
450TEST_CUSTOM(bitfield, bitfield, { 4, 1 });
451// CHECK-LABEL: @test_bitfield_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000452// CHECK: %custom = alloca %struct.bitfield, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000453// CHECK-NEXT: bitcast
454// CHECK-NEXT: call void @llvm.memcpy
455// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
456
457TEST_UNINIT(bitfieldaligned, bitfieldaligned);
458// CHECK-LABEL: @test_bitfieldaligned_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000459// CHECK: %uninit = alloca %struct.bitfieldaligned, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000460// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
461
462TEST_BRACES(bitfieldaligned, bitfieldaligned);
463// CHECK-LABEL: @test_bitfieldaligned_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000464// CHECK: %braces = alloca %struct.bitfieldaligned, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000465// CHECK-NEXT: bitcast
466// CHECK-NEXT: call void @llvm.memcpy
467// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
468
469TEST_CUSTOM(bitfieldaligned, bitfieldaligned, { 4, 1 });
470// CHECK-LABEL: @test_bitfieldaligned_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000471// CHECK: %custom = alloca %struct.bitfieldaligned, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000472// CHECK-NEXT: bitcast
473// CHECK-NEXT: call void @llvm.memcpy
474// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
475
476TEST_UNINIT(big, big);
477// CHECK-LABEL: @test_big_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000478// CHECK: %uninit = alloca %struct.big, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000479// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
480
481TEST_BRACES(big, big);
482// CHECK-LABEL: @test_big_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000483// CHECK: %braces = alloca %struct.big, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000484// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000485// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 104, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000486// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
487
488TEST_CUSTOM(big, big, { 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA, 0xAAAAAAAA });
489// CHECK-LABEL: @test_big_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000490// CHECK: %custom = alloca %struct.big, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000491// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000492// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 -86, i64 104, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000493// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
494
495TEST_UNINIT(arraytail, arraytail);
496// CHECK-LABEL: @test_arraytail_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000497// CHECK: %uninit = alloca %struct.arraytail, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000498// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
499
500TEST_BRACES(arraytail, arraytail);
501// CHECK-LABEL: @test_arraytail_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000502// CHECK: %braces = alloca %struct.arraytail, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000503// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000504// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 4, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000505// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
506
507TEST_CUSTOM(arraytail, arraytail, { 0xdead });
508// CHECK-LABEL: @test_arraytail_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000509// CHECK: %custom = alloca %struct.arraytail, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000510// CHECK-NEXT: bitcast
511// CHECK-NEXT: call void @llvm.memcpy
512// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
513
514
515TEST_UNINIT(int0, int[0]);
516// CHECK-LABEL: @test_int0_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000517// CHECK: %uninit = alloca [0 x i32], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000518// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
519
520TEST_BRACES(int0, int[0]);
521// CHECK-LABEL: @test_int0_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000522// CHECK: %braces = alloca [0 x i32], align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000523// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000524// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 0, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000525// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
526
527TEST_UNINIT(int1, int[1]);
528// CHECK-LABEL: @test_int1_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000529// CHECK: %uninit = alloca [1 x i32], align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000530// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
531
532TEST_BRACES(int1, int[1]);
533// CHECK-LABEL: @test_int1_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000534// CHECK: %braces = alloca [1 x i32], align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000535// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000536// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 4, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000537// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
538
539TEST_CUSTOM(int1, int[1], { 0x33333333 });
540// CHECK-LABEL: @test_int1_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000541// CHECK: %custom = alloca [1 x i32], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000542// CHECK-NEXT: bitcast
543// CHECK-NEXT: call void @llvm.memcpy
544// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
545
546TEST_UNINIT(int64, int[64]);
547// CHECK-LABEL: @test_int64_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000548// CHECK: %uninit = alloca [64 x i32], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000549// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
550
551TEST_BRACES(int64, int[64]);
552// CHECK-LABEL: @test_int64_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000553// CHECK: %braces = alloca [64 x i32], align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000554// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000555// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 256, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000556// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
557
558TEST_CUSTOM(int64, int[64], = { 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111, 0x11111111 });
559// CHECK-LABEL: @test_int64_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000560// CHECK: %custom = alloca [64 x i32], align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000561// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000562// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 17, i64 256, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000563// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
564
565TEST_UNINIT(bool4, bool[4]);
566// CHECK-LABEL: @test_bool4_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000567// CHECK: %uninit = alloca [4 x i8], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000568// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
569
570TEST_BRACES(bool4, bool[4]);
571// CHECK-LABEL: @test_bool4_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000572// CHECK: %braces = alloca [4 x i8], align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000573// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000574// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 4, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000575// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
576
577TEST_CUSTOM(bool4, bool[4], { true, true, true, true });
578// CHECK-LABEL: @test_bool4_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000579// CHECK: %custom = alloca [4 x i8], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000580// CHECK-NEXT: bitcast
581// CHECK-NEXT: call void @llvm.memcpy
582// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
583
584TEST_UNINIT(intptr4, int*[4]);
585// CHECK-LABEL: @test_intptr4_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000586// CHECK: %uninit = alloca [4 x i32*], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000587// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
588
589TEST_BRACES(intptr4, int*[4]);
590// CHECK-LABEL: @test_intptr4_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000591// CHECK: %braces = alloca [4 x i32*], align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000592// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000593// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 32, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000594// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
595
596 TEST_CUSTOM(intptr4, int*[4], = { (int*)0x22222222, (int*)0x22222222, (int*)0x22222222, (int*)0x22222222 });
597// CHECK-LABEL: @test_intptr4_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000598// CHECK: %custom = alloca [4 x i32*], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000599// CHECK-NEXT: bitcast
600// CHECK-NEXT: call void @llvm.memcpy
601// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
602
603TEST_UNINIT(tailpad4, tailpad[4]);
604// CHECK-LABEL: @test_tailpad4_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000605// CHECK: %uninit = alloca [4 x %struct.tailpad], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000606// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
607
608TEST_BRACES(tailpad4, tailpad[4]);
609// CHECK-LABEL: @test_tailpad4_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000610// CHECK: %braces = alloca [4 x %struct.tailpad], align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000611// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000612// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 16, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000613// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
614
JF Bastienfe2ea822018-08-08 17:05:17 +0000615TEST_CUSTOM(tailpad4, tailpad[4], { {257, 1}, {257, 1}, {257, 1}, {257, 1} });
JF Bastienc70f65e2018-08-07 03:12:52 +0000616// CHECK-LABEL: @test_tailpad4_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000617// CHECK: %custom = alloca [4 x %struct.tailpad], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000618// CHECK-NEXT: bitcast
619// CHECK-NEXT: call void @llvm.memcpy
620// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
621
JF Bastienfe2ea822018-08-08 17:05:17 +0000622TEST_UNINIT(tailpad9, tailpad[9]);
623// CHECK-LABEL: @test_tailpad9_uninit()
624// CHECK: %uninit = alloca [9 x %struct.tailpad], align
625// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
626
627TEST_BRACES(tailpad9, tailpad[9]);
628// CHECK-LABEL: @test_tailpad9_braces()
629// CHECK: %braces = alloca [9 x %struct.tailpad], align [[ALIGN:[0-9]*]]
630// CHECK-NEXT: bitcast
631// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 36, i1 false)
632// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
633
634TEST_CUSTOM(tailpad9, tailpad[9], { {257, 1}, {257, 1}, {257, 1}, {257, 1}, {257, 1}, {257, 1}, {257, 1}, {257, 1}, {257, 1} });
635// CHECK-LABEL: @test_tailpad9_custom()
636// CHECK: %custom = alloca [9 x %struct.tailpad], align [[ALIGN:[0-9]*]]
637// CHECK-NEXT: bitcast
638// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 1, i64 36, i1 false)
639// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
640
JF Bastienc70f65e2018-08-07 03:12:52 +0000641
642TEST_UNINIT(atomicbool, _Atomic(bool));
643// CHECK-LABEL: @test_atomicbool_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000644// CHECK: %uninit = alloca i8, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000645// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
646
647TEST_UNINIT(atomicint, _Atomic(int));
648// CHECK-LABEL: @test_atomicint_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000649// CHECK: %uninit = alloca i32, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000650// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
651
652TEST_UNINIT(atomicdouble, _Atomic(double));
653// CHECK-LABEL: @test_atomicdouble_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000654// CHECK: %uninit = alloca double, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000655// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
656
657TEST_UNINIT(atomicnotlockfree, _Atomic(notlockfree));
658// CHECK-LABEL: @test_atomicnotlockfree_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000659// CHECK: %uninit = alloca %struct.notlockfree, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000660// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
661
662TEST_UNINIT(atomicpadded, _Atomic(padded));
663// CHECK-LABEL: @test_atomicpadded_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000664// CHECK: %uninit = alloca %struct.padded, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000665// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
666
667TEST_UNINIT(atomictailpad, _Atomic(tailpad));
668// CHECK-LABEL: @test_atomictailpad_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000669// CHECK: %uninit = alloca %struct.tailpad, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000670// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
671
672
673TEST_UNINIT(complexfloat, _Complex float);
674// CHECK-LABEL: @test_complexfloat_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000675// CHECK: %uninit = alloca { float, float }, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000676// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
677
678TEST_BRACES(complexfloat, _Complex float);
679// CHECK-LABEL: @test_complexfloat_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000680// CHECK: %braces = alloca { float, float }, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000681// CHECK-NEXT: %[[R:[^ ]*]] = getelementptr inbounds { float, float }, { float, float }* %braces, i32 0, i32 0
682// CHECK-NEXT: %[[I:[^ ]*]] = getelementptr inbounds { float, float }, { float, float }* %braces, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +0000683// CHECK-NEXT: store float 0.000000e+00, float* %[[R]], align [[ALIGN]]
684// CHECK-NEXT: store float 0.000000e+00, float* %[[I]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000685// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
686
687TEST_CUSTOM(complexfloat, _Complex float, { 3.1415926535897932384626433, 3.1415926535897932384626433 });
688// CHECK-LABEL: @test_complexfloat_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000689// CHECK: %custom = alloca { float, float }, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000690// CHECK-NEXT: %[[R:[^ ]*]] = getelementptr inbounds { float, float }, { float, float }* %custom, i32 0, i32 0
691// CHECK-NEXT: %[[I:[^ ]*]] = getelementptr inbounds { float, float }, { float, float }* %custom, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +0000692// CHECK-NEXT: store float 0x400921FB60000000, float* %[[R]], align [[ALIGN]]
693// CHECK-NEXT: store float 0x400921FB60000000, float* %[[I]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000694// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
695
696TEST_UNINIT(complexdouble, _Complex double);
697// CHECK-LABEL: @test_complexdouble_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000698// CHECK: %uninit = alloca { double, double }, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000699// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
700
701TEST_BRACES(complexdouble, _Complex double);
702// CHECK-LABEL: @test_complexdouble_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000703// CHECK: %braces = alloca { double, double }, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000704// CHECK-NEXT: %[[R:[^ ]*]] = getelementptr inbounds { double, double }, { double, double }* %braces, i32 0, i32 0
705// CHECK-NEXT: %[[I:[^ ]*]] = getelementptr inbounds { double, double }, { double, double }* %braces, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +0000706// CHECK-NEXT: store double 0.000000e+00, double* %[[R]], align [[ALIGN]]
707// CHECK-NEXT: store double 0.000000e+00, double* %[[I]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000708// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
709
710TEST_CUSTOM(complexdouble, _Complex double, { 3.1415926535897932384626433, 3.1415926535897932384626433 });
711// CHECK-LABEL: @test_complexdouble_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000712// CHECK: %custom = alloca { double, double }, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000713// CHECK-NEXT: %[[R:[^ ]*]] = getelementptr inbounds { double, double }, { double, double }* %custom, i32 0, i32 0
714// CHECK-NEXT: %[[I:[^ ]*]] = getelementptr inbounds { double, double }, { double, double }* %custom, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +0000715// CHECK-NEXT: store double 0x400921FB54442D18, double* %[[R]], align [[ALIGN]]
716// CHECK-NEXT: store double 0x400921FB54442D18, double* %[[I]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000717// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
718
719
720TEST_UNINIT(volatileint, volatile int);
721// CHECK-LABEL: @test_volatileint_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000722// CHECK: %uninit = alloca i32, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000723// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
724
725TEST_BRACES(volatileint, volatile int);
726// CHECK-LABEL: @test_volatileint_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000727// CHECK: %braces = alloca i32, align [[ALIGN:[0-9]*]]
728// CHECK-NEXT: store volatile i32 0, i32* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000729// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
730
731TEST_UNINIT(semivolatile, semivolatile);
732// CHECK-LABEL: @test_semivolatile_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000733// CHECK: %uninit = alloca %struct.semivolatile, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000734// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
735
736TEST_BRACES(semivolatile, semivolatile);
737// CHECK-LABEL: @test_semivolatile_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000738// CHECK: %braces = alloca %struct.semivolatile, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000739// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000740// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 8, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000741// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
742
743TEST_CUSTOM(semivolatile, semivolatile, { 0x44444444, 0x44444444 });
744// CHECK-LABEL: @test_semivolatile_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000745// CHECK: %custom = alloca %struct.semivolatile, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000746// CHECK-NEXT: bitcast
747// CHECK-NEXT: call void @llvm.memcpy
748// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
749
750TEST_UNINIT(semivolatileinit, semivolatileinit);
751// CHECK-LABEL: @test_semivolatileinit_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000752// CHECK: %uninit = alloca %struct.semivolatileinit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000753// CHECK-NEXT: call void @{{.*}}semivolatileinit{{.*}}%uninit)
754// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
755
756TEST_BRACES(semivolatileinit, semivolatileinit);
757// CHECK-LABEL: @test_semivolatileinit_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000758// CHECK: %braces = alloca %struct.semivolatileinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000759// CHECK-NEXT: %[[I:[^ ]*]] = getelementptr inbounds %struct.semivolatileinit, %struct.semivolatileinit* %braces, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000760// CHECK-NEXT: store i32 286331153, i32* %[[I]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000761// CHECK-NEXT: %[[VI:[^ ]*]] = getelementptr inbounds %struct.semivolatileinit, %struct.semivolatileinit* %braces, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +0000762// CHECK-NEXT: store volatile i32 286331153, i32* %[[VI]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000763// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
764
765TEST_CUSTOM(semivolatileinit, semivolatileinit, { 0x44444444, 0x44444444 });
766// CHECK-LABEL: @test_semivolatileinit_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000767// CHECK: %custom = alloca %struct.semivolatileinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000768// CHECK-NEXT: %[[I:[^ ]*]] = getelementptr inbounds %struct.semivolatileinit, %struct.semivolatileinit* %custom, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000769// CHECK-NEXT: store i32 1145324612, i32* %[[I]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000770// CHECK-NEXT: %[[VI:[^ ]*]] = getelementptr inbounds %struct.semivolatileinit, %struct.semivolatileinit* %custom, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +0000771// CHECK-NEXT: store volatile i32 1145324612, i32* %[[VI]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000772// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
773
774
775TEST_UNINIT(base, base);
776// CHECK-LABEL: @test_base_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000777// CHECK: %uninit = alloca %struct.base, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000778// CHECK-NEXT: call void @{{.*}}base{{.*}}%uninit)
779// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
780
781TEST_BRACES(base, base);
782// CHECK-LABEL: @test_base_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000783// CHECK: %braces = alloca %struct.base, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000784// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000785// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 8, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000786// CHECK-NEXT: call void @{{.*}}base{{.*}}%braces)
787// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
788
789TEST_UNINIT(derived, derived);
790// CHECK-LABEL: @test_derived_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000791// CHECK: %uninit = alloca %struct.derived, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000792// CHECK-NEXT: call void @{{.*}}derived{{.*}}%uninit)
793// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
794
795TEST_BRACES(derived, derived);
796// CHECK-LABEL: @test_derived_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000797// CHECK: %braces = alloca %struct.derived, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000798// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000799// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 8, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000800// CHECK-NEXT: call void @{{.*}}derived{{.*}}%braces)
801// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
802
803TEST_UNINIT(virtualderived, virtualderived);
804// CHECK-LABEL: @test_virtualderived_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000805// CHECK: %uninit = alloca %struct.virtualderived, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000806// CHECK-NEXT: call void @{{.*}}virtualderived{{.*}}%uninit)
807// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
808
809TEST_BRACES(virtualderived, virtualderived);
810// CHECK-LABEL: @test_virtualderived_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000811// CHECK: %braces = alloca %struct.virtualderived, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000812// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000813// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 16, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000814// CHECK-NEXT: call void @{{.*}}virtualderived{{.*}}%braces)
815// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
816
817
818TEST_UNINIT(matching, matching);
819// CHECK-LABEL: @test_matching_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000820// CHECK: %uninit = alloca %union.matching, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000821// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
822
823TEST_BRACES(matching, matching);
824// CHECK-LABEL: @test_matching_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000825// CHECK: %braces = alloca %union.matching, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000826// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000827// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 4, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000828// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
829
830TEST_CUSTOM(matching, matching, { .f = 0xf00f });
831// CHECK-LABEL: @test_matching_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000832// CHECK: %custom = alloca %union.matching, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000833// CHECK-NEXT: bitcast
834// CHECK-NEXT: call void @llvm.memcpy
835// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
836
837TEST_UNINIT(matchingreverse, matchingreverse);
838// CHECK-LABEL: @test_matchingreverse_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000839// CHECK: %uninit = alloca %union.matchingreverse, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000840// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
841
842TEST_BRACES(matchingreverse, matchingreverse);
843// CHECK-LABEL: @test_matchingreverse_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000844// CHECK: %braces = alloca %union.matchingreverse, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000845// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000846// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 4, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000847// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
848
849TEST_CUSTOM(matchingreverse, matchingreverse, { .i = 0xf00f });
850// CHECK-LABEL: @test_matchingreverse_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000851// CHECK: %custom = alloca %union.matchingreverse, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000852// CHECK-NEXT: bitcast
853// CHECK-NEXT: call void @llvm.memcpy
854// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
855
856TEST_UNINIT(unmatched, unmatched);
857// CHECK-LABEL: @test_unmatched_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000858// CHECK: %uninit = alloca %union.unmatched, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000859// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
860
861TEST_BRACES(unmatched, unmatched);
862// CHECK-LABEL: @test_unmatched_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000863// CHECK: %braces = alloca %union.unmatched, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000864// CHECK-NEXT: bitcast
865// CHECK-NEXT: call void @llvm.memcpy
866// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
867
868TEST_CUSTOM(unmatched, unmatched, { .i = 0x3badbeef });
869// CHECK-LABEL: @test_unmatched_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000870// CHECK: %custom = alloca %union.unmatched, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000871// CHECK-NEXT: bitcast
872// CHECK-NEXT: call void @llvm.memcpy
873// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
874
875TEST_UNINIT(unmatchedreverse, unmatchedreverse);
876// CHECK-LABEL: @test_unmatchedreverse_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000877// CHECK: %uninit = alloca %union.unmatchedreverse, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000878// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
879
880TEST_BRACES(unmatchedreverse, unmatchedreverse);
881// CHECK-LABEL: @test_unmatchedreverse_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000882// CHECK: %braces = alloca %union.unmatchedreverse, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000883// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000884// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 4, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000885// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
886
887TEST_CUSTOM(unmatchedreverse, unmatchedreverse, { .c = 42 });
888// CHECK-LABEL: @test_unmatchedreverse_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000889// CHECK: %custom = alloca %union.unmatchedreverse, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000890// CHECK-NEXT: bitcast
891// CHECK-NEXT: call void @llvm.memcpy
892// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
893
894TEST_UNINIT(unmatchedfp, unmatchedfp);
895// CHECK-LABEL: @test_unmatchedfp_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000896// CHECK: %uninit = alloca %union.unmatchedfp, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000897// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
898
899TEST_BRACES(unmatchedfp, unmatchedfp);
900// CHECK-LABEL: @test_unmatchedfp_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000901// CHECK: %braces = alloca %union.unmatchedfp, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000902// CHECK-NEXT: bitcast
903// CHECK-NEXT: call void @llvm.memcpy
904// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
905
906TEST_CUSTOM(unmatchedfp, unmatchedfp, { .d = 3.1415926535897932384626433 });
907// CHECK-LABEL: @test_unmatchedfp_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000908// CHECK: %custom = alloca %union.unmatchedfp, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000909// CHECK-NEXT: bitcast
910// CHECK-NEXT: call void @llvm.memcpy
911// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
912
913
914TEST_UNINIT(emptyenum, emptyenum);
915// CHECK-LABEL: @test_emptyenum_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000916// CHECK: %uninit = alloca i32, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000917// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
918
919TEST_BRACES(emptyenum, emptyenum);
920// CHECK-LABEL: @test_emptyenum_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000921// CHECK: %braces = alloca i32, align [[ALIGN:[0-9]*]]
922// CHECK-NEXT: store i32 0, i32* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000923// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
924
925TEST_CUSTOM(emptyenum, emptyenum, { (emptyenum)42 });
926// CHECK-LABEL: @test_emptyenum_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000927// CHECK: %custom = alloca i32, align [[ALIGN:[0-9]*]]
928// CHECK-NEXT: store i32 42, i32* %custom, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000929// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
930
931TEST_UNINIT(smallenum, smallenum);
932// CHECK-LABEL: @test_smallenum_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000933// CHECK: %uninit = alloca i32, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000934// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
935
936TEST_BRACES(smallenum, smallenum);
937// CHECK-LABEL: @test_smallenum_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000938// CHECK: %braces = alloca i32, align [[ALIGN:[0-9]*]]
939// CHECK-NEXT: store i32 0, i32* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000940// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
941
942TEST_CUSTOM(smallenum, smallenum, { (smallenum)42 });
943// CHECK-LABEL: @test_smallenum_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000944// CHECK: %custom = alloca i32, align [[ALIGN:[0-9]*]]
945// CHECK-NEXT: store i32 42, i32* %custom, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000946// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
947
948
949TEST_UNINIT(intvec16, int __attribute__((vector_size(16))));
950// CHECK-LABEL: @test_intvec16_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000951// CHECK: %uninit = alloca <4 x i32>, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000952// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
953
954TEST_BRACES(intvec16, int __attribute__((vector_size(16))));
955// CHECK-LABEL: @test_intvec16_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000956// CHECK: %braces = alloca <4 x i32>, align [[ALIGN:[0-9]*]]
957// CHECK-NEXT: store <4 x i32> zeroinitializer, <4 x i32>* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000958// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
959
960 TEST_CUSTOM(intvec16, int __attribute__((vector_size(16))), { 0x44444444, 0x44444444, 0x44444444, 0x44444444 });
961// CHECK-LABEL: @test_intvec16_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000962// CHECK: %custom = alloca <4 x i32>, align [[ALIGN:[0-9]*]]
963// CHECK-NEXT: store <4 x i32> <i32 1145324612, i32 1145324612, i32 1145324612, i32 1145324612>, <4 x i32>* %custom, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000964// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
965
966TEST_UNINIT(longlongvec32, long long __attribute__((vector_size(32))));
967// CHECK-LABEL: @test_longlongvec32_uninit()
JF Bastien81377932018-08-07 04:44:13 +0000968// CHECK: %uninit = alloca <4 x i64>, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000969// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
970
971TEST_BRACES(longlongvec32, long long __attribute__((vector_size(32))));
972// CHECK-LABEL: @test_longlongvec32_braces()
JF Bastien81377932018-08-07 04:44:13 +0000973// CHECK: %braces = alloca <4 x i64>, align [[ALIGN:[0-9]*]]
974// CHECK-NEXT: store <4 x i64> zeroinitializer, <4 x i64>* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000975// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
976
977TEST_CUSTOM(longlongvec32, long long __attribute__((vector_size(32))), { 0x3333333333333333, 0x3333333333333333, 0x3333333333333333, 0x3333333333333333 });
978// CHECK-LABEL: @test_longlongvec32_custom()
JF Bastien81377932018-08-07 04:44:13 +0000979// CHECK: %custom = alloca <4 x i64>, align [[ALIGN:[0-9]*]]
980// CHECK-NEXT: store <4 x i64> <i64 3689348814741910323, i64 3689348814741910323, i64 3689348814741910323, i64 3689348814741910323>, <4 x i64>* %custom, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000981// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
982
983TEST_UNINIT(floatvec16, float __attribute__((vector_size(16))));
984// CHECK-LABEL: @test_floatvec16_uninit()
JF Bastien81377932018-08-07 04:44:13 +0000985// CHECK: %uninit = alloca <4 x float>, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000986// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
987
988TEST_BRACES(floatvec16, float __attribute__((vector_size(16))));
989// CHECK-LABEL: @test_floatvec16_braces()
JF Bastien81377932018-08-07 04:44:13 +0000990// CHECK: %braces = alloca <4 x float>, align [[ALIGN:[0-9]*]]
991// CHECK-NEXT: store <4 x float> zeroinitializer, <4 x float>* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000992// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
993
994TEST_CUSTOM(floatvec16, float __attribute__((vector_size(16))), { 3.1415926535897932384626433, 3.1415926535897932384626433, 3.1415926535897932384626433, 3.1415926535897932384626433 });
995// CHECK-LABEL: @test_floatvec16_custom()
JF Bastien81377932018-08-07 04:44:13 +0000996// CHECK: %custom = alloca <4 x float>, align [[ALIGN:[0-9]*]]
997// CHECK-NEXT: store <4 x float> <float 0x400921FB60000000, float 0x400921FB60000000, float 0x400921FB60000000, float 0x400921FB60000000>, <4 x float>* %custom, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000998// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
999
1000TEST_UNINIT(doublevec32, double __attribute__((vector_size(32))));
1001// CHECK-LABEL: @test_doublevec32_uninit()
JF Bastien81377932018-08-07 04:44:13 +00001002// CHECK: %uninit = alloca <4 x double>, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001003// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
1004
1005TEST_BRACES(doublevec32, double __attribute__((vector_size(32))));
1006// CHECK-LABEL: @test_doublevec32_braces()
JF Bastien81377932018-08-07 04:44:13 +00001007// CHECK: %braces = alloca <4 x double>, align [[ALIGN:[0-9]*]]
1008// CHECK-NEXT: store <4 x double> zeroinitializer, <4 x double>* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001009// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1010
1011TEST_CUSTOM(doublevec32, double __attribute__((vector_size(32))), { 3.1415926535897932384626433, 3.1415926535897932384626433, 3.1415926535897932384626433, 3.1415926535897932384626433 });
1012// CHECK-LABEL: @test_doublevec32_custom()
JF Bastien81377932018-08-07 04:44:13 +00001013// CHECK: %custom = alloca <4 x double>, align [[ALIGN:[0-9]*]]
1014// CHECK-NEXT: store <4 x double> <double 0x400921FB54442D18, double 0x400921FB54442D18, double 0x400921FB54442D18, double 0x400921FB54442D18>, <4 x double>* %custom, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001015// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
1016
1017
1018} // extern "C"