blob: f09609f7c28eebf90709bdd6da02c85c9e5cedce [file] [log] [blame]
Nemanja Ivanovicdb64e7e2019-02-05 12:05:53 +00001// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks %s -emit-llvm -o - | FileCheck %s
2// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks -ftrivial-auto-var-init=pattern %s -emit-llvm -o - | FileCheck %s -check-prefix=PATTERN
3// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks -ftrivial-auto-var-init=zero %s -emit-llvm -o - | FileCheck %s -check-prefix=ZERO
JF Bastienc70f65e2018-08-07 03:12:52 +00004
5template<typename T> void used(T &) noexcept;
6
7#define TEST_UNINIT(NAME, TYPE) \
8 using type_##NAME = TYPE; \
9 void test_##NAME##_uninit() { \
10 type_##NAME uninit; \
11 used(uninit); \
12 }
13
14// Value initialization on scalars, aggregate initialization on aggregates.
15#define TEST_BRACES(NAME, TYPE) \
16 using type_##NAME = TYPE; \
17 void test_##NAME##_braces() { \
18 type_##NAME braces = {}; \
19 used(braces); \
20 }
21
22#define TEST_CUSTOM(NAME, TYPE, ...) \
23 using type_##NAME = TYPE; \
24 void test_##NAME##_custom() { \
25 type_##NAME custom __VA_ARGS__; \
26 used(custom); \
27 }
28
JF Bastien14daa202018-12-18 05:12:21 +000029// None of the synthesized globals should contain `undef`.
30// PATTERN-NOT: undef
31// ZERO-NOT: undef
32
33// PATTERN: @__const.test_empty_uninit.uninit = private unnamed_addr constant %struct.empty { i8 -86 }, align 1
JF Bastienc70f65e2018-08-07 03:12:52 +000034struct empty {};
JF Bastien14daa202018-12-18 05:12:21 +000035// PATTERN: @__const.test_small_uninit.uninit = private unnamed_addr constant %struct.small { i8 -86 }, align 1
36// PATTERN: @__const.test_small_custom.custom = private unnamed_addr constant %struct.small { i8 42 }, align 1
37// ZERO: @__const.test_small_custom.custom = private unnamed_addr constant %struct.small { i8 42 }, align 1
JF Bastienc70f65e2018-08-07 03:12:52 +000038struct small { char c; };
JF Bastien14daa202018-12-18 05:12:21 +000039// PATTERN: @__const.test_smallinit_uninit.uninit = private unnamed_addr constant %struct.smallinit { i8 -86 }, align 1
40// PATTERN: @__const.test_smallinit_braces.braces = private unnamed_addr constant %struct.smallinit { i8 -86 }, align 1
41// PATTERN: @__const.test_smallinit_custom.custom = private unnamed_addr constant %struct.smallinit { i8 -86 }, align 1
JF Bastienc70f65e2018-08-07 03:12:52 +000042struct smallinit { char c = 42; };
JF Bastien14daa202018-12-18 05:12:21 +000043// PATTERN: @__const.test_smallpartinit_uninit.uninit = private unnamed_addr constant %struct.smallpartinit { i8 -86, i8 -86 }, align 1
44// PATTERN: @__const.test_smallpartinit_braces.braces = private unnamed_addr constant %struct.smallpartinit { i8 -86, i8 -86 }, align 1
45// PATTERN: @__const.test_smallpartinit_custom.custom = private unnamed_addr constant %struct.smallpartinit { i8 -86, i8 -86 }, align 1
JF Bastienc70f65e2018-08-07 03:12:52 +000046struct smallpartinit { char c = 42, d; };
JF Bastien14daa202018-12-18 05:12:21 +000047// PATTERN: @__const.test_nullinit_uninit.uninit = private unnamed_addr constant %struct.nullinit { i8* inttoptr (i64 -6148914691236517206 to i8*) }, align 8
48// PATTERN: @__const.test_nullinit_braces.braces = private unnamed_addr constant %struct.nullinit { i8* inttoptr (i64 -6148914691236517206 to i8*) }, align 8
49// PATTERN: @__const.test_nullinit_custom.custom = private unnamed_addr constant %struct.nullinit { i8* inttoptr (i64 -6148914691236517206 to i8*) }, align 8
JF Bastienc70f65e2018-08-07 03:12:52 +000050struct nullinit { char* null = nullptr; };
Alexander Potapenko4f7bc0e2019-02-26 10:46:21 +000051// PATTERN: @__const.test_padded_uninit.uninit = private unnamed_addr constant { i8, [3 x i8], i32 } { i8 -86, [3 x i8] c"\AA\AA\AA", i32 -1431655766 }, align 4
52// PATTERN: @__const.test_padded_custom.custom = private unnamed_addr constant { i8, [3 x i8], i32 } { i8 42, [3 x i8] c"\AA\AA\AA", i32 13371337 }, align 4
53// ZERO: @__const.test_padded_custom.custom = private unnamed_addr constant { i8, [3 x i8], i32 } { i8 42, [3 x i8] zeroinitializer, i32 13371337 }, align 4
JF Bastienc70f65e2018-08-07 03:12:52 +000054struct padded { char c; int i; };
Alexander Potapenko4f7bc0e2019-02-26 10:46:21 +000055// PATTERN: @__const.test_paddednullinit_uninit.uninit = private unnamed_addr constant { i8, [3 x i8], i32 } { i8 -86, [3 x i8] c"\AA\AA\AA", i32 -1431655766 }, align 4
56// PATTERN: @__const.test_paddednullinit_braces.braces = private unnamed_addr constant { i8, [3 x i8], i32 } { i8 -86, [3 x i8] c"\AA\AA\AA", i32 -1431655766 }, align 4
57// PATTERN: @__const.test_paddednullinit_custom.custom = private unnamed_addr constant { i8, [3 x i8], i32 } { i8 -86, [3 x i8] c"\AA\AA\AA", i32 -1431655766 }, align 4
JF Bastienc70f65e2018-08-07 03:12:52 +000058struct paddednullinit { char c = 0; int i = 0; };
Alexander Potapenko4f7bc0e2019-02-26 10:46:21 +000059// PATTERN: @__const.test_paddedpacked_uninit.uninit = private unnamed_addr constant %struct.paddedpacked <{ i8 -86, i32 -1431655766 }>, align 1
60// PATTERN: @__const.test_paddedpacked_custom.custom = private unnamed_addr constant %struct.paddedpacked <{ i8 42, i32 13371337 }>, align 1
61// ZERO: @__const.test_paddedpacked_custom.custom = private unnamed_addr constant %struct.paddedpacked <{ i8 42, i32 13371337 }>, align 1
62struct paddedpacked { char c; int i; } __attribute__((packed));
63// PATTERN: @__const.test_paddedpackedarray_uninit.uninit = private unnamed_addr constant %struct.paddedpackedarray { [2 x %struct.paddedpacked] [%struct.paddedpacked <{ i8 -86, i32 -1431655766 }>, %struct.paddedpacked <{ i8 -86, i32 -1431655766 }>] }, align 1
64// PATTERN: @__const.test_paddedpackedarray_custom.custom = private unnamed_addr constant %struct.paddedpackedarray { [2 x %struct.paddedpacked] [%struct.paddedpacked <{ i8 42, i32 13371337 }>, %struct.paddedpacked <{ i8 43, i32 13371338 }>] }, align 1
65// ZERO: @__const.test_paddedpackedarray_custom.custom = private unnamed_addr constant %struct.paddedpackedarray { [2 x %struct.paddedpacked] [%struct.paddedpacked <{ i8 42, i32 13371337 }>, %struct.paddedpacked <{ i8 43, i32 13371338 }>] }, align 1
66struct paddedpackedarray { struct paddedpacked p[2]; };
67// PATTERN: @__const.test_paddednested_uninit.uninit = private unnamed_addr constant { { i8, [3 x i8], i32 }, { i8, [3 x i8], i32 } } { { i8, [3 x i8], i32 } { i8 -86, [3 x i8] c"\AA\AA\AA", i32 -1431655766 }, { i8, [3 x i8], i32 } { i8 -86, [3 x i8] c"\AA\AA\AA", i32 -1431655766 } }, align 4
68// PATTERN: @__const.test_paddednested_custom.custom = private unnamed_addr constant { { i8, [3 x i8], i32 }, { i8, [3 x i8], i32 } } { { i8, [3 x i8], i32 } { i8 42, [3 x i8] c"\AA\AA\AA", i32 13371337 }, { i8, [3 x i8], i32 } { i8 43, [3 x i8] c"\AA\AA\AA", i32 13371338 } }, align 4
69// ZERO: @__const.test_paddednested_custom.custom = private unnamed_addr constant { { i8, [3 x i8], i32 }, { i8, [3 x i8], i32 } } { { i8, [3 x i8], i32 } { i8 42, [3 x i8] zeroinitializer, i32 13371337 }, { i8, [3 x i8], i32 } { i8 43, [3 x i8] zeroinitializer, i32 13371338 } }, align 4
70struct paddednested { struct padded p1, p2; };
71// PATTERN: @__const.test_paddedpackednested_uninit.uninit = private unnamed_addr constant %struct.paddedpackednested { %struct.paddedpacked <{ i8 -86, i32 -1431655766 }>, %struct.paddedpacked <{ i8 -86, i32 -1431655766 }> }, align 1
72// PATTERN: @__const.test_paddedpackednested_custom.custom = private unnamed_addr constant %struct.paddedpackednested { %struct.paddedpacked <{ i8 42, i32 13371337 }>, %struct.paddedpacked <{ i8 43, i32 13371338 }> }, align 1
73// ZERO: @__const.test_paddedpackednested_custom.custom = private unnamed_addr constant %struct.paddedpackednested { %struct.paddedpacked <{ i8 42, i32 13371337 }>, %struct.paddedpacked <{ i8 43, i32 13371338 }> }, align 1
74struct paddedpackednested { struct paddedpacked p1, p2; };
JF Bastien14daa202018-12-18 05:12:21 +000075// PATTERN: @__const.test_bitfield_uninit.uninit = private unnamed_addr constant %struct.bitfield { i8 -86, [3 x i8] c"\AA\AA\AA" }, align 4
Alexander Potapenko4f7bc0e2019-02-26 10:46:21 +000076// PATTERN: @__const.test_bitfield_custom.custom = private unnamed_addr constant %struct.bitfield { i8 20, [3 x i8] c"\AA\AA\AA" }, align 4
JF Bastien14daa202018-12-18 05:12:21 +000077// ZERO: @__const.test_bitfield_custom.custom = private unnamed_addr constant %struct.bitfield { i8 20, [3 x i8] zeroinitializer }, align 4
JF Bastienc70f65e2018-08-07 03:12:52 +000078struct bitfield { int i : 4; int j : 2; };
JF Bastien14daa202018-12-18 05:12:21 +000079// PATTERN: @__const.test_bitfieldaligned_uninit.uninit = private unnamed_addr constant %struct.bitfieldaligned { i8 -86, [3 x i8] c"\AA\AA\AA", i8 -86, [3 x i8] c"\AA\AA\AA" }, align 4
Alexander Potapenko4f7bc0e2019-02-26 10:46:21 +000080// PATTERN: @__const.test_bitfieldaligned_custom.custom = private unnamed_addr constant %struct.bitfieldaligned { i8 4, [3 x i8] c"\AA\AA\AA", i8 1, [3 x i8] c"\AA\AA\AA" }, align 4
JF Bastien14daa202018-12-18 05:12:21 +000081// ZERO: @__const.test_bitfieldaligned_custom.custom = private unnamed_addr constant %struct.bitfieldaligned { i8 4, [3 x i8] zeroinitializer, i8 1, [3 x i8] zeroinitializer }, align 4
JF Bastienc70f65e2018-08-07 03:12:52 +000082struct bitfieldaligned { int i : 4; int : 0; int j : 2; };
83struct 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; };
JF Bastien14daa202018-12-18 05:12:21 +000084// PATTERN: @__const.test_arraytail_uninit.uninit = private unnamed_addr constant %struct.arraytail { i32 -1431655766, [0 x i32] zeroinitializer }, align 4
85// PATTERN: @__const.test_arraytail_custom.custom = private unnamed_addr constant %struct.arraytail { i32 57005, [0 x i32] zeroinitializer }, align 4
86// ZERO: @__const.test_arraytail_custom.custom = private unnamed_addr constant %struct.arraytail { i32 57005, [0 x i32] zeroinitializer }, align 4
JF Bastienc70f65e2018-08-07 03:12:52 +000087struct arraytail { int i; int arr[]; };
JF Bastien14daa202018-12-18 05:12:21 +000088// PATTERN: @__const.test_int1_uninit.uninit = private unnamed_addr constant [1 x i32] [i32 -1431655766], align 4
89// PATTERN: @__const.test_int1_custom.custom = private unnamed_addr constant [1 x i32] [i32 858993459], align 4
90// ZERO: @__const.test_int1_custom.custom = private unnamed_addr constant [1 x i32] [i32 858993459], align 4
91// PATTERN: @__const.test_bool4_uninit.uninit = private unnamed_addr constant [4 x i8] c"\AA\AA\AA\AA", align 1
92// PATTERN: @__const.test_bool4_custom.custom = private unnamed_addr constant [4 x i8] c"\01\01\01\01", align 1
93// ZERO: @__const.test_bool4_custom.custom = private unnamed_addr constant [4 x i8] c"\01\01\01\01", align 1
94// PATTERN: @__const.test_intptr4_uninit.uninit = private unnamed_addr constant [4 x i32*] [i32* inttoptr (i64 -6148914691236517206 to i32*), i32* inttoptr (i64 -6148914691236517206 to i32*), i32* inttoptr (i64 -6148914691236517206 to i32*), i32* inttoptr (i64 -6148914691236517206 to i32*)], align 16
95// PATTERN: @__const.test_intptr4_custom.custom = private unnamed_addr constant [4 x i32*] [i32* inttoptr (i64 572662306 to i32*), i32* inttoptr (i64 572662306 to i32*), i32* inttoptr (i64 572662306 to i32*), i32* inttoptr (i64 572662306 to i32*)], align 16
96// ZERO: @__const.test_intptr4_custom.custom = private unnamed_addr constant [4 x i32*] [i32* inttoptr (i64 572662306 to i32*), i32* inttoptr (i64 572662306 to i32*), i32* inttoptr (i64 572662306 to i32*), i32* inttoptr (i64 572662306 to i32*)], align 16
Alexander Potapenko4f7bc0e2019-02-26 10:46:21 +000097// PATTERN: @__const.test_tailpad4_uninit.uninit = private unnamed_addr constant [4 x { i16, i8, [1 x i8] }] [{ i16, i8, [1 x i8] } { i16 -21846, i8 -86, [1 x i8] c"\AA" }, { i16, i8, [1 x i8] } { i16 -21846, i8 -86, [1 x i8] c"\AA" }, { i16, i8, [1 x i8] } { i16 -21846, i8 -86, [1 x i8] c"\AA" }, { i16, i8, [1 x i8] } { i16 -21846, i8 -86, [1 x i8] c"\AA" }], align 16
98// PATTERN: @__const.test_tailpad4_custom.custom = private unnamed_addr constant [4 x { i16, i8, [1 x i8] }] [{ i16, i8, [1 x i8] } { i16 257, i8 1, [1 x i8] c"\AA" }, { i16, i8, [1 x i8] } { i16 257, i8 1, [1 x i8] c"\AA" }, { i16, i8, [1 x i8] } { i16 257, i8 1, [1 x i8] c"\AA" }, { i16, i8, [1 x i8] } { i16 257, i8 1, [1 x i8] c"\AA" }], align 16
99// ZERO: @__const.test_tailpad4_custom.custom = private unnamed_addr constant [4 x { i16, i8, [1 x i8] }] [{ i16, i8, [1 x i8] } { i16 257, i8 1, [1 x i8] zeroinitializer }, { i16, i8, [1 x i8] } { i16 257, i8 1, [1 x i8] zeroinitializer }, { i16, i8, [1 x i8] } { i16 257, i8 1, [1 x i8] zeroinitializer }, { i16, i8, [1 x i8] } { i16 257, i8 1, [1 x i8] zeroinitializer }], align 16
JF Bastienc70f65e2018-08-07 03:12:52 +0000100struct tailpad { short s; char c; };
JF Bastien14daa202018-12-18 05:12:21 +0000101// PATTERN: @__const.test_atomicnotlockfree_uninit.uninit = private unnamed_addr constant %struct.notlockfree { [4 x i64] [i64 -6148914691236517206, i64 -6148914691236517206, i64 -6148914691236517206, i64 -6148914691236517206] }, align 8
JF Bastienc70f65e2018-08-07 03:12:52 +0000102struct notlockfree { long long a[4]; };
Alexander Potapenko4f7bc0e2019-02-26 10:46:21 +0000103// PATTERN: @__const.test_atomicpadded_uninit.uninit = private unnamed_addr constant { i8, [3 x i8], i32 } { i8 -86, [3 x i8] c"\AA\AA\AA", i32 -1431655766 }, align 8
104// PATTERN: @__const.test_atomictailpad_uninit.uninit = private unnamed_addr constant { i16, i8, [1 x i8] } { i16 -21846, i8 -86, [1 x i8] c"\AA" }, align 4
JF Bastien14daa202018-12-18 05:12:21 +0000105// PATTERN: @__const.test_complexfloat_uninit.uninit = private unnamed_addr constant { float, float } { float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000 }, align 4
106// PATTERN: @__const.test_complexfloat_braces.braces = private unnamed_addr constant { float, float } { float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000 }, align 4
107// PATTERN: @__const.test_complexfloat_custom.custom = private unnamed_addr constant { float, float } { float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000 }, align 4
108// PATTERN: @__const.test_complexdouble_uninit.uninit = private unnamed_addr constant { double, double } { double 0xFFFFFFFFFFFFFFFF, double 0xFFFFFFFFFFFFFFFF }, align 8
109// PATTERN: @__const.test_complexdouble_braces.braces = private unnamed_addr constant { double, double } { double 0xFFFFFFFFFFFFFFFF, double 0xFFFFFFFFFFFFFFFF }, align 8
110// PATTERN: @__const.test_complexdouble_custom.custom = private unnamed_addr constant { double, double } { double 0xFFFFFFFFFFFFFFFF, double 0xFFFFFFFFFFFFFFFF }, align 8
111// PATTERN: @__const.test_semivolatile_uninit.uninit = private unnamed_addr constant %struct.semivolatile { i32 -1431655766, i32 -1431655766 }, align 4
112// PATTERN: @__const.test_semivolatile_custom.custom = private unnamed_addr constant %struct.semivolatile { i32 1145324612, i32 1145324612 }, align 4
JF Bastienc70f65e2018-08-07 03:12:52 +0000113struct semivolatile { int i; volatile int vi; };
JF Bastien14daa202018-12-18 05:12:21 +0000114// PATTERN: @__const.test_semivolatileinit_uninit.uninit = private unnamed_addr constant %struct.semivolatileinit { i32 -1431655766, i32 -1431655766 }, align 4
115// PATTERN: @__const.test_semivolatileinit_braces.braces = private unnamed_addr constant %struct.semivolatileinit { i32 -1431655766, i32 -1431655766 }, align 4
116// PATTERN: @__const.test_semivolatileinit_custom.custom = private unnamed_addr constant %struct.semivolatileinit { i32 -1431655766, i32 -1431655766 }, align 4
117// ZERO: @__const.test_semivolatile_custom.custom = private unnamed_addr constant %struct.semivolatile { i32 1145324612, i32 1145324612 }, align 4
JF Bastienc70f65e2018-08-07 03:12:52 +0000118struct semivolatileinit { int i = 0x11111111; volatile int vi = 0x11111111; };
JF Bastien14daa202018-12-18 05:12:21 +0000119// PATTERN: @__const.test_base_uninit.uninit = private unnamed_addr constant %struct.base { i32 (...)** inttoptr (i64 -6148914691236517206 to i32 (...)**) }, align 8
120// PATTERN: @__const.test_base_braces.braces = private unnamed_addr constant %struct.base { i32 (...)** inttoptr (i64 -6148914691236517206 to i32 (...)**) }, align 8
JF Bastienc70f65e2018-08-07 03:12:52 +0000121struct base { virtual ~base(); };
JF Bastien14daa202018-12-18 05:12:21 +0000122// PATTERN: @__const.test_derived_uninit.uninit = private unnamed_addr constant %struct.derived { %struct.base { i32 (...)** inttoptr (i64 -6148914691236517206 to i32 (...)**) } }, align 8
123// PATTERN: @__const.test_derived_braces.braces = private unnamed_addr constant %struct.derived { %struct.base { i32 (...)** inttoptr (i64 -6148914691236517206 to i32 (...)**) } }, align 8
JF Bastienc70f65e2018-08-07 03:12:52 +0000124struct derived : public base {};
JF Bastien14daa202018-12-18 05:12:21 +0000125// PATTERN: @__const.test_virtualderived_uninit.uninit = private unnamed_addr constant %struct.virtualderived { %struct.base { i32 (...)** inttoptr (i64 -6148914691236517206 to i32 (...)**) }, %struct.derived { %struct.base { i32 (...)** inttoptr (i64 -6148914691236517206 to i32 (...)**) } } }, align 8
126// PATTERN: @__const.test_virtualderived_braces.braces = private unnamed_addr constant %struct.virtualderived { %struct.base { i32 (...)** inttoptr (i64 -6148914691236517206 to i32 (...)**) }, %struct.derived { %struct.base { i32 (...)** inttoptr (i64 -6148914691236517206 to i32 (...)**) } } }, align 8
JF Bastienc70f65e2018-08-07 03:12:52 +0000127struct virtualderived : public virtual base, public virtual derived {};
JF Bastien14daa202018-12-18 05:12:21 +0000128// PATTERN: @__const.test_matching_uninit.uninit = private unnamed_addr constant %union.matching { i32 -1431655766 }, align 4
129// PATTERN: @__const.test_matching_custom.custom = private unnamed_addr constant { float } { float 6.145500e+04 }, align 4
JF Bastien17aec7b2019-02-25 23:09:34 +0000130// ZERO: @__const.test_matching_custom.custom = private unnamed_addr constant { float } { float 6.145500e+04 }, align 4
JF Bastienc70f65e2018-08-07 03:12:52 +0000131union matching { int i; float f; };
JF Bastien14daa202018-12-18 05:12:21 +0000132// PATTERN: @__const.test_matchingreverse_uninit.uninit = private unnamed_addr constant %union.matchingreverse { float 0xFFFFFFFFE0000000 }, align 4
133// PATTERN: @__const.test_matchingreverse_custom.custom = private unnamed_addr constant { i32 } { i32 61455 }, align 4
JF Bastien17aec7b2019-02-25 23:09:34 +0000134// ZERO: @__const.test_matchingreverse_custom.custom = private unnamed_addr constant { i32 } { i32 61455 }, align 4
JF Bastienc70f65e2018-08-07 03:12:52 +0000135union matchingreverse { float f; int i; };
JF Bastien14daa202018-12-18 05:12:21 +0000136// PATTERN: @__const.test_unmatched_uninit.uninit = private unnamed_addr constant %union.unmatched { i32 -1431655766 }, align 4
137// PATTERN: @__const.test_unmatched_custom.custom = private unnamed_addr constant %union.unmatched { i32 1001242351 }, align 4
JF Bastien17aec7b2019-02-25 23:09:34 +0000138// ZERO: @__const.test_unmatched_custom.custom = private unnamed_addr constant %union.unmatched { i32 1001242351 }, align 4
JF Bastienc70f65e2018-08-07 03:12:52 +0000139union unmatched { char c; int i; };
JF Bastien14daa202018-12-18 05:12:21 +0000140// PATTERN: @__const.test_unmatchedreverse_uninit.uninit = private unnamed_addr constant %union.unmatchedreverse { i32 -1431655766 }, align 4
Alexander Potapenko4f7bc0e2019-02-26 10:46:21 +0000141// PATTERN: @__const.test_unmatchedreverse_custom.custom = private unnamed_addr constant { i8, [3 x i8] } { i8 42, [3 x i8] c"\AA\AA\AA" }, align 4
JF Bastien17aec7b2019-02-25 23:09:34 +0000142// ZERO: @__const.test_unmatchedreverse_custom.custom = private unnamed_addr constant { i8, [3 x i8] } { i8 42, [3 x i8] zeroinitializer }, align 4
JF Bastienc70f65e2018-08-07 03:12:52 +0000143union unmatchedreverse { int i; char c; };
JF Bastien14daa202018-12-18 05:12:21 +0000144// PATTERN: @__const.test_unmatchedfp_uninit.uninit = private unnamed_addr constant %union.unmatchedfp { double 0xFFFFFFFFFFFFFFFF }, align 8
145// PATTERN: @__const.test_unmatchedfp_custom.custom = private unnamed_addr constant %union.unmatchedfp { double 0x400921FB54442D18 }, align 8
JF Bastien14daa202018-12-18 05:12:21 +0000146// ZERO: @__const.test_unmatchedfp_custom.custom = private unnamed_addr constant %union.unmatchedfp { double 0x400921FB54442D18 }, align 8
JF Bastienc70f65e2018-08-07 03:12:52 +0000147union unmatchedfp { float f; double d; };
148enum emptyenum {};
149enum smallenum { VALUE };
150
151extern "C" {
152
153TEST_UNINIT(char, char);
154// CHECK-LABEL: @test_char_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000155// CHECK: %uninit = alloca i8, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000156// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000157// PATTERN-LABEL: @test_char_uninit()
158// PATTERN: store i8 -86, i8* %uninit, align 1
159// ZERO-LABEL: @test_char_uninit()
160// ZERO: store i8 0, i8* %uninit, align 1
JF Bastienc70f65e2018-08-07 03:12:52 +0000161
162TEST_BRACES(char, char);
163// CHECK-LABEL: @test_char_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000164// CHECK: %braces = alloca i8, align [[ALIGN:[0-9]*]]
165// CHECK-NEXT: store i8 0, i8* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000166// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
167
168TEST_UNINIT(uchar, unsigned char);
169// CHECK-LABEL: @test_uchar_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000170// CHECK: %uninit = alloca i8, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000171// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000172// PATTERN-LABEL: @test_uchar_uninit()
173// PATTERN: store i8 -86, i8* %uninit, align 1
174// ZERO-LABEL: @test_uchar_uninit()
175// ZERO: store i8 0, i8* %uninit, align 1
JF Bastienc70f65e2018-08-07 03:12:52 +0000176
177TEST_BRACES(uchar, unsigned char);
178// CHECK-LABEL: @test_uchar_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000179// CHECK: %braces = alloca i8, align [[ALIGN:[0-9]*]]
180// CHECK-NEXT: store i8 0, i8* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000181// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
182
183TEST_UNINIT(schar, signed char);
184// CHECK-LABEL: @test_schar_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000185// CHECK: %uninit = alloca i8, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000186// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000187// PATTERN-LABEL: @test_schar_uninit()
188// PATTERN: store i8 -86, i8* %uninit, align 1
189// ZERO-LABEL: @test_schar_uninit()
190// ZERO: store i8 0, i8* %uninit, align 1
JF Bastienc70f65e2018-08-07 03:12:52 +0000191
192TEST_BRACES(schar, signed char);
193// CHECK-LABEL: @test_schar_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000194// CHECK: %braces = alloca i8, align [[ALIGN:[0-9]*]]
195// CHECK-NEXT: store i8 0, i8* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000196// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
197
198TEST_UNINIT(wchar_t, wchar_t);
199// CHECK-LABEL: @test_wchar_t_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000200// CHECK: %uninit = alloca i32, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000201// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000202// PATTERN-LABEL: @test_wchar_t_uninit()
203// PATTERN: store i32 -1431655766, i32* %uninit, align
204// ZERO-LABEL: @test_wchar_t_uninit()
205// ZERO: store i32 0, i32* %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000206
207TEST_BRACES(wchar_t, wchar_t);
208// CHECK-LABEL: @test_wchar_t_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000209// CHECK: %braces = alloca i32, align [[ALIGN:[0-9]*]]
210// CHECK-NEXT: store i32 0, i32* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000211// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
212
213TEST_UNINIT(short, short);
214// CHECK-LABEL: @test_short_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000215// CHECK: %uninit = alloca i16, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000216// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000217// PATTERN-LABEL: @test_short_uninit()
218// PATTERN: store i16 -21846, i16* %uninit, align
219// ZERO-LABEL: @test_short_uninit()
220// ZERO: store i16 0, i16* %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000221
222TEST_BRACES(short, short);
223// CHECK-LABEL: @test_short_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000224// CHECK: %braces = alloca i16, align [[ALIGN:[0-9]*]]
225// CHECK-NEXT: store i16 0, i16* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000226// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
227
228TEST_UNINIT(ushort, unsigned short);
229// CHECK-LABEL: @test_ushort_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000230// CHECK: %uninit = alloca i16, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000231// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000232// PATTERN-LABEL: @test_ushort_uninit()
233// PATTERN: store i16 -21846, i16* %uninit, align
234// ZERO-LABEL: @test_ushort_uninit()
235// ZERO: store i16 0, i16* %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000236
237TEST_BRACES(ushort, unsigned short);
238// CHECK-LABEL: @test_ushort_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000239// CHECK: %braces = alloca i16, align [[ALIGN:[0-9]*]]
240// CHECK-NEXT: store i16 0, i16* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000241// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
242
243TEST_UNINIT(int, int);
244// CHECK-LABEL: @test_int_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000245// CHECK: %uninit = alloca i32, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000246// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000247// PATTERN-LABEL: @test_int_uninit()
248// PATTERN: store i32 -1431655766, i32* %uninit, align
249// ZERO-LABEL: @test_int_uninit()
250// ZERO: store i32 0, i32* %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000251
252TEST_BRACES(int, int);
253// CHECK-LABEL: @test_int_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000254// CHECK: %braces = alloca i32, align [[ALIGN:[0-9]*]]
255// CHECK-NEXT: store i32 0, i32* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000256// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
257
258TEST_UNINIT(unsigned, unsigned);
259// CHECK-LABEL: @test_unsigned_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000260// CHECK: %uninit = alloca i32, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000261// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000262// PATTERN-LABEL: @test_unsigned_uninit()
263// PATTERN: store i32 -1431655766, i32* %uninit, align
264// ZERO-LABEL: @test_unsigned_uninit()
265// ZERO: store i32 0, i32* %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000266
267TEST_BRACES(unsigned, unsigned);
268// CHECK-LABEL: @test_unsigned_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000269// CHECK: %braces = alloca i32, align [[ALIGN:[0-9]*]]
270// CHECK-NEXT: store i32 0, i32* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000271// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
272
273TEST_UNINIT(long, long);
274// CHECK-LABEL: @test_long_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000275// CHECK: %uninit = alloca i64, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000276// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000277// PATTERN-LABEL: @test_long_uninit()
278// PATTERN: store i64 -6148914691236517206, i64* %uninit, align
279// ZERO-LABEL: @test_long_uninit()
280// ZERO: store i64 0, i64* %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000281
282TEST_BRACES(long, long);
283// CHECK-LABEL: @test_long_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000284// CHECK: %braces = alloca i64, align [[ALIGN:[0-9]*]]
285// CHECK-NEXT: store i64 0, i64* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000286// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
287
288TEST_UNINIT(ulong, unsigned long);
289// CHECK-LABEL: @test_ulong_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000290// CHECK: %uninit = alloca i64, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000291// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000292// PATTERN-LABEL: @test_ulong_uninit()
293// PATTERN: store i64 -6148914691236517206, i64* %uninit, align
294// ZERO-LABEL: @test_ulong_uninit()
295// ZERO: store i64 0, i64* %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000296
297TEST_BRACES(ulong, unsigned long);
298// CHECK-LABEL: @test_ulong_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000299// CHECK: %braces = alloca i64, align [[ALIGN:[0-9]*]]
300// CHECK-NEXT: store i64 0, i64* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000301// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
302
303TEST_UNINIT(longlong, long long);
304// CHECK-LABEL: @test_longlong_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000305// CHECK: %uninit = alloca i64, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000306// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000307// PATTERN-LABEL: @test_longlong_uninit()
308// PATTERN: store i64 -6148914691236517206, i64* %uninit, align
309// ZERO-LABEL: @test_longlong_uninit()
310// ZERO: store i64 0, i64* %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000311
312TEST_BRACES(longlong, long long);
313// CHECK-LABEL: @test_longlong_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000314// CHECK: %braces = alloca i64, align [[ALIGN:[0-9]*]]
315// CHECK-NEXT: store i64 0, i64* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000316// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
317
318TEST_UNINIT(ulonglong, unsigned long long);
319// CHECK-LABEL: @test_ulonglong_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000320// CHECK: %uninit = alloca i64, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000321// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000322// PATTERN-LABEL: @test_ulonglong_uninit()
323// PATTERN: store i64 -6148914691236517206, i64* %uninit, align
324// ZERO-LABEL: @test_ulonglong_uninit()
325// ZERO: store i64 0, i64* %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000326
327TEST_BRACES(ulonglong, unsigned long long);
328// CHECK-LABEL: @test_ulonglong_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000329// CHECK: %braces = alloca i64, align [[ALIGN:[0-9]*]]
330// CHECK-NEXT: store i64 0, i64* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000331// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
332
333TEST_UNINIT(int128, __int128);
334// CHECK-LABEL: @test_int128_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000335// CHECK: %uninit = alloca i128, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000336// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000337// PATTERN-LABEL: @test_int128_uninit()
338// PATTERN: store i128 -113427455640312821154458202477256070486, i128* %uninit, align
339// ZERO-LABEL: @test_int128_uninit()
340// ZERO: store i128 0, i128* %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000341
342TEST_BRACES(int128, __int128);
343// CHECK-LABEL: @test_int128_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000344// CHECK: %braces = alloca i128, align [[ALIGN:[0-9]*]]
345// CHECK-NEXT: store i128 0, i128* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000346// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
347
348TEST_UNINIT(uint128, unsigned __int128);
349// CHECK-LABEL: @test_uint128_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000350// CHECK: %uninit = alloca i128, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000351// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000352// PATTERN-LABEL: @test_uint128_uninit()
353// PATTERN: store i128 -113427455640312821154458202477256070486, i128* %uninit, align
354// ZERO-LABEL: @test_uint128_uninit()
355// ZERO: store i128 0, i128* %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000356
357TEST_BRACES(uint128, unsigned __int128);
358// CHECK-LABEL: @test_uint128_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000359// CHECK: %braces = alloca i128, align [[ALIGN:[0-9]*]]
360// CHECK-NEXT: store i128 0, i128* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000361// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
362
363
364TEST_UNINIT(fp16, __fp16);
365// CHECK-LABEL: @test_fp16_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000366// CHECK: %uninit = alloca half, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000367// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000368// PATTERN-LABEL: @test_fp16_uninit()
369// PATTERN: store half 0xHFFFF, half* %uninit, align
370// ZERO-LABEL: @test_fp16_uninit()
371// ZERO: store half 0xH0000, half* %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000372
373TEST_BRACES(fp16, __fp16);
374// CHECK-LABEL: @test_fp16_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000375// CHECK: %braces = alloca half, align [[ALIGN:[0-9]*]]
376// CHECK-NEXT: store half 0xH0000, half* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000377// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
378
379TEST_UNINIT(float, float);
380// CHECK-LABEL: @test_float_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000381// CHECK: %uninit = alloca float, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000382// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000383// PATTERN-LABEL: @test_float_uninit()
384// PATTERN: store float 0xFFFFFFFFE0000000, float* %uninit, align
385// ZERO-LABEL: @test_float_uninit()
386// ZERO: store float 0.000000e+00, float* %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000387
388TEST_BRACES(float, float);
389// CHECK-LABEL: @test_float_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000390// CHECK: %braces = alloca float, align [[ALIGN:[0-9]*]]
391// CHECK-NEXT: store float 0.000000e+00, float* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000392// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
393
394TEST_UNINIT(double, double);
395// CHECK-LABEL: @test_double_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000396// CHECK: %uninit = alloca double, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000397// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000398// PATTERN-LABEL: @test_double_uninit()
399// PATTERN: store double 0xFFFFFFFFFFFFFFFF, double* %uninit, align
400// ZERO-LABEL: @test_double_uninit()
401// ZERO: store double 0.000000e+00, double* %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000402
403TEST_BRACES(double, double);
404// CHECK-LABEL: @test_double_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000405// CHECK: %braces = alloca double, align [[ALIGN:[0-9]*]]
406// CHECK-NEXT: store double 0.000000e+00, double* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000407// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
408
409TEST_UNINIT(longdouble, long double);
410// CHECK-LABEL: @test_longdouble_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000411// CHECK: %uninit = alloca x86_fp80, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000412// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000413// PATTERN-LABEL: @test_longdouble_uninit()
414// PATTERN: store x86_fp80 0xKFFFFFFFFFFFFFFFFFFFF, x86_fp80* %uninit, align
415// ZERO-LABEL: @test_longdouble_uninit()
416// ZERO: store x86_fp80 0xK00000000000000000000, x86_fp80* %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000417
418TEST_BRACES(longdouble, long double);
419// CHECK-LABEL: @test_longdouble_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000420// CHECK: %braces = alloca x86_fp80, align [[ALIGN:[0-9]*]]
421// CHECK-NEXT: store x86_fp80 0xK00000000000000000000, x86_fp80* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000422// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
423
424
425TEST_UNINIT(intptr, int*);
426// CHECK-LABEL: @test_intptr_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000427// CHECK: %uninit = alloca i32*, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000428// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000429// PATTERN-LABEL: @test_intptr_uninit()
430// PATTERN: store i32* inttoptr (i64 -6148914691236517206 to i32*), i32** %uninit, align
431// ZERO-LABEL: @test_intptr_uninit()
432// ZERO: store i32* null, i32** %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000433
434TEST_BRACES(intptr, int*);
435// CHECK-LABEL: @test_intptr_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000436// CHECK: %braces = alloca i32*, align [[ALIGN:[0-9]*]]
437// CHECK-NEXT: store i32* null, i32** %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000438// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
439
440TEST_UNINIT(intptrptr, int**);
441// CHECK-LABEL: @test_intptrptr_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000442// CHECK: %uninit = alloca i32**, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000443// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000444// PATTERN-LABEL: @test_intptrptr_uninit()
445// PATTERN: store i32** inttoptr (i64 -6148914691236517206 to i32**), i32*** %uninit, align
446// ZERO-LABEL: @test_intptrptr_uninit()
447// ZERO: store i32** null, i32*** %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000448
449TEST_BRACES(intptrptr, int**);
450// CHECK-LABEL: @test_intptrptr_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000451// CHECK: %braces = alloca i32**, align [[ALIGN:[0-9]*]]
452// CHECK-NEXT: store i32** null, i32*** %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000453// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
454
455TEST_UNINIT(function, void(*)());
456// CHECK-LABEL: @test_function_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000457// CHECK: %uninit = alloca void ()*, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000458// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000459// PATTERN-LABEL: @test_function_uninit()
460// PATTERN: store void ()* inttoptr (i64 -6148914691236517206 to void ()*), void ()** %uninit, align
461// ZERO-LABEL: @test_function_uninit()
462// ZERO: store void ()* null, void ()** %uninit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000463
464TEST_BRACES(function, void(*)());
465// CHECK-LABEL: @test_function_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000466// CHECK: %braces = alloca void ()*, align [[ALIGN:[0-9]*]]
467// CHECK-NEXT: store void ()* null, void ()** %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000468// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
469
470TEST_UNINIT(bool, bool);
471// CHECK-LABEL: @test_bool_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000472// CHECK: %uninit = alloca i8, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000473// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000474// PATTERN-LABEL: @test_bool_uninit()
475// PATTERN: store i8 -86, i8* %uninit, align 1
476// ZERO-LABEL: @test_bool_uninit()
477// ZERO: store i8 0, i8* %uninit, align 1
JF Bastienc70f65e2018-08-07 03:12:52 +0000478
479TEST_BRACES(bool, bool);
480// CHECK-LABEL: @test_bool_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000481// CHECK: %braces = alloca i8, align [[ALIGN:[0-9]*]]
482// CHECK-NEXT: store i8 0, i8* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000483// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
484
485
486TEST_UNINIT(empty, empty);
487// CHECK-LABEL: @test_empty_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000488// CHECK: %uninit = alloca %struct.empty, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000489// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000490// PATTERN-LABEL: @test_empty_uninit()
491// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_empty_uninit.uninit
492// ZERO-LABEL: @test_empty_uninit()
493// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +0000494
495TEST_BRACES(empty, empty);
496// CHECK-LABEL: @test_empty_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000497// CHECK: %braces = alloca %struct.empty, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000498// CHECK-NEXT: bitcast
499// CHECK-NEXT: call void @llvm.memcpy
500// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
501
502TEST_UNINIT(small, small);
503// CHECK-LABEL: @test_small_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000504// CHECK: %uninit = alloca %struct.small, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000505// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000506// PATTERN-LABEL: @test_small_uninit()
507// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_small_uninit.uninit
508// ZERO-LABEL: @test_small_uninit()
509// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +0000510
511TEST_BRACES(small, small);
512// CHECK-LABEL: @test_small_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000513// CHECK: %braces = alloca %struct.small, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000514// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000515// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 1, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000516// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
517
JF Bastien14daa202018-12-18 05:12:21 +0000518TEST_CUSTOM(small, small, { 42 });
JF Bastienc70f65e2018-08-07 03:12:52 +0000519// CHECK-LABEL: @test_small_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000520// CHECK: %custom = alloca %struct.small, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000521// CHECK-NEXT: bitcast
522// CHECK-NEXT: call void @llvm.memcpy
523// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
524
525TEST_UNINIT(smallinit, smallinit);
526// CHECK-LABEL: @test_smallinit_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000527// CHECK: %uninit = alloca %struct.smallinit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000528// CHECK-NEXT: call void @{{.*}}smallinit{{.*}}%uninit)
529// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
530
531TEST_BRACES(smallinit, smallinit);
532// CHECK-LABEL: @test_smallinit_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000533// CHECK: %braces = alloca %struct.smallinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000534// CHECK-NEXT: %[[C:[^ ]*]] = getelementptr inbounds %struct.smallinit, %struct.smallinit* %braces, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000535// CHECK-NEXT: store i8 42, i8* %[[C]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000536// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
537
538TEST_CUSTOM(smallinit, smallinit, { 100 });
539// CHECK-LABEL: @test_smallinit_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000540// CHECK: %custom = alloca %struct.smallinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000541// CHECK-NEXT: %[[C:[^ ]*]] = getelementptr inbounds %struct.smallinit, %struct.smallinit* %custom, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000542// CHECK-NEXT: store i8 100, i8* %[[C]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000543// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
544
545TEST_UNINIT(smallpartinit, smallpartinit);
546// CHECK-LABEL: @test_smallpartinit_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000547// CHECK: %uninit = alloca %struct.smallpartinit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000548// CHECK-NEXT: call void @{{.*}}smallpartinit{{.*}}%uninit)
549// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000550// PATTERN-LABEL: @test_smallpartinit_uninit()
551// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_smallpartinit_uninit.uninit
552// ZERO-LABEL: @test_smallpartinit_uninit()
553// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +0000554
555TEST_BRACES(smallpartinit, smallpartinit);
556// CHECK-LABEL: @test_smallpartinit_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000557// CHECK: %braces = alloca %struct.smallpartinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000558// CHECK-NEXT: %[[C:[^ ]*]] = getelementptr inbounds %struct.smallpartinit, %struct.smallpartinit* %braces, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000559// CHECK-NEXT: store i8 42, i8* %[[C]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000560// CHECK-NEXT: %[[D:[^ ]*]] = getelementptr inbounds %struct.smallpartinit, %struct.smallpartinit* %braces, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +0000561// CHECK-NEXT: store i8 0, i8* %[[D]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000562// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
563
564TEST_CUSTOM(smallpartinit, smallpartinit, { 100, 42 });
565// CHECK-LABEL: @test_smallpartinit_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000566// CHECK: %custom = alloca %struct.smallpartinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000567// CHECK-NEXT: %[[C:[^ ]*]] = getelementptr inbounds %struct.smallpartinit, %struct.smallpartinit* %custom, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000568// CHECK-NEXT: store i8 100, i8* %[[C]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000569// CHECK-NEXT: %[[D:[^ ]*]] = getelementptr inbounds %struct.smallpartinit, %struct.smallpartinit* %custom, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +0000570// CHECK-NEXT: store i8 42, i8* %[[D]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000571// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
572
573TEST_UNINIT(nullinit, nullinit);
574// CHECK-LABEL: @test_nullinit_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000575// CHECK: %uninit = alloca %struct.nullinit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000576// CHECK-NEXT: call void @{{.*}}nullinit{{.*}}%uninit)
577// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
578
579TEST_BRACES(nullinit, nullinit);
580// CHECK-LABEL: @test_nullinit_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000581// CHECK: %braces = alloca %struct.nullinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000582// CHECK-NEXT: %[[N:[^ ]*]] = getelementptr inbounds %struct.nullinit, %struct.nullinit* %braces, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000583// CHECK-NEXT: store i8* null, i8** %[[N]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000584// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
585
586TEST_CUSTOM(nullinit, nullinit, { (char*)"derp" });
587// CHECK-LABEL: @test_nullinit_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000588// CHECK: %custom = alloca %struct.nullinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000589// CHECK-NEXT: %[[N:[^ ]*]] = getelementptr inbounds %struct.nullinit, %struct.nullinit* %custom, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000590// CHECK-NEXT: store i8* getelementptr inbounds {{.*}}, i8** %[[N]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000591// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
592
593TEST_UNINIT(padded, padded);
594// CHECK-LABEL: @test_padded_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000595// CHECK: %uninit = alloca %struct.padded, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000596// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000597// PATTERN-LABEL: @test_padded_uninit()
598// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_padded_uninit.uninit
599// ZERO-LABEL: @test_padded_uninit()
600// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +0000601
602TEST_BRACES(padded, padded);
603// CHECK-LABEL: @test_padded_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000604// CHECK: %braces = alloca %struct.padded, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000605// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000606// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 8, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000607// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
608
609TEST_CUSTOM(padded, padded, { 42, 13371337 });
610// CHECK-LABEL: @test_padded_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000611// CHECK: %custom = alloca %struct.padded, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000612// CHECK-NEXT: bitcast
613// CHECK-NEXT: call void @llvm.memcpy
614// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
615
616TEST_UNINIT(paddednullinit, paddednullinit);
617// CHECK-LABEL: @test_paddednullinit_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000618// CHECK: %uninit = alloca %struct.paddednullinit, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000619// CHECK-NEXT: call void @{{.*}}paddednullinit{{.*}}%uninit)
620// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000621// PATTERN-LABEL: @test_paddednullinit_uninit()
622// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_paddednullinit_uninit.uninit
623// ZERO-LABEL: @test_paddednullinit_uninit()
624// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +0000625
626TEST_BRACES(paddednullinit, paddednullinit);
627// CHECK-LABEL: @test_paddednullinit_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000628// CHECK: %braces = alloca %struct.paddednullinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000629// CHECK-NEXT: %[[C:[^ ]*]] = getelementptr inbounds %struct.paddednullinit, %struct.paddednullinit* %braces, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000630// CHECK-NEXT: store i8 0, i8* %[[C]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000631// CHECK-NEXT: %[[I:[^ ]*]] = getelementptr inbounds %struct.paddednullinit, %struct.paddednullinit* %braces, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +0000632// CHECK-NEXT: store i32 0, i32* %[[I]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000633// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
634
635TEST_CUSTOM(paddednullinit, paddednullinit, { 42, 13371337 });
636// CHECK-LABEL: @test_paddednullinit_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000637// CHECK: %custom = alloca %struct.paddednullinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000638// CHECK-NEXT: %[[C:[^ ]*]] = getelementptr inbounds %struct.paddednullinit, %struct.paddednullinit* %custom, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +0000639// CHECK-NEXT: store i8 42, i8* %[[C]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000640// CHECK-NEXT: %[[I:[^ ]*]] = getelementptr inbounds %struct.paddednullinit, %struct.paddednullinit* %custom, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +0000641// CHECK-NEXT: store i32 13371337, i32* %[[I]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000642// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
643
Alexander Potapenko4f7bc0e2019-02-26 10:46:21 +0000644TEST_UNINIT(paddedpacked, paddedpacked);
645// CHECK-LABEL: @test_paddedpacked_uninit()
646// CHECK: %uninit = alloca %struct.paddedpacked, align
647// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
648// PATTERN-LABEL: @test_paddedpacked_uninit()
649// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_paddedpacked_uninit.uninit
650// ZERO-LABEL: @test_paddedpacked_uninit()
651// ZERO: call void @llvm.memset{{.*}}, i8 0,
652
653TEST_BRACES(paddedpacked, paddedpacked);
654// CHECK-LABEL: @test_paddedpacked_braces()
655// CHECK: %braces = alloca %struct.paddedpacked, align [[ALIGN:[0-9]*]]
656// CHECK-NEXT: bitcast
657// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 5, i1 false)
658// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
659
660TEST_CUSTOM(paddedpacked, paddedpacked, { 42, 13371337 });
661// CHECK-LABEL: @test_paddedpacked_custom()
662// CHECK: %custom = alloca %struct.paddedpacked, align
663// CHECK-NEXT: bitcast
664// CHECK-NEXT: call void @llvm.memcpy
665// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
666
667TEST_UNINIT(paddedpackedarray, paddedpackedarray);
668// CHECK-LABEL: @test_paddedpackedarray_uninit()
669// CHECK: %uninit = alloca %struct.paddedpackedarray, align
670// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
671// PATTERN-LABEL: @test_paddedpackedarray_uninit()
672// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_paddedpackedarray_uninit.uninit
673// ZERO-LABEL: @test_paddedpackedarray_uninit()
674// ZERO: call void @llvm.memset{{.*}}, i8 0,
675
676TEST_BRACES(paddedpackedarray, paddedpackedarray);
677// CHECK-LABEL: @test_paddedpackedarray_braces()
678// CHECK: %braces = alloca %struct.paddedpackedarray, align [[ALIGN:[0-9]*]]
679// CHECK-NEXT: bitcast
680// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 10, i1 false)
681// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
682
683TEST_CUSTOM(paddedpackedarray, paddedpackedarray, { {{ 42, 13371337 }, { 43, 13371338 }} });
684// CHECK-LABEL: @test_paddedpackedarray_custom()
685// CHECK: %custom = alloca %struct.paddedpackedarray, align
686// CHECK-NEXT: bitcast
687// CHECK-NEXT: call void @llvm.memcpy
688// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
689
690TEST_UNINIT(paddednested, paddednested);
691// CHECK-LABEL: @test_paddednested_uninit()
692// CHECK: %uninit = alloca %struct.paddednested, align
693// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
694// PATTERN-LABEL: @test_paddednested_uninit()
695// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_paddednested_uninit.uninit
696// ZERO-LABEL: @test_paddednested_uninit()
697// ZERO: call void @llvm.memset{{.*}}, i8 0,
698
699TEST_BRACES(paddednested, paddednested);
700// CHECK-LABEL: @test_paddednested_braces()
701// CHECK: %braces = alloca %struct.paddednested, align [[ALIGN:[0-9]*]]
702// CHECK-NEXT: bitcast
703// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 16, i1 false)
704// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
705
706TEST_CUSTOM(paddednested, paddednested, { { 42, 13371337 }, { 43, 13371338 } });
707// CHECK-LABEL: @test_paddednested_custom()
708// CHECK: %custom = alloca %struct.paddednested, align
709// CHECK-NEXT: bitcast
710// CHECK-NEXT: call void @llvm.memcpy
711// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
712
713TEST_UNINIT(paddedpackednested, paddedpackednested);
714// CHECK-LABEL: @test_paddedpackednested_uninit()
715// CHECK: %uninit = alloca %struct.paddedpackednested, align
716// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
717// PATTERN-LABEL: @test_paddedpackednested_uninit()
718// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_paddedpackednested_uninit.uninit
719// ZERO-LABEL: @test_paddedpackednested_uninit()
720// ZERO: call void @llvm.memset{{.*}}, i8 0,
721
722TEST_BRACES(paddedpackednested, paddedpackednested);
723// CHECK-LABEL: @test_paddedpackednested_braces()
724// CHECK: %braces = alloca %struct.paddedpackednested, align [[ALIGN:[0-9]*]]
725// CHECK-NEXT: bitcast
726// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 10, i1 false)
727// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
728
729TEST_CUSTOM(paddedpackednested, paddedpackednested, { { 42, 13371337 }, { 43, 13371338 } });
730// CHECK-LABEL: @test_paddedpackednested_custom()
731// CHECK: %custom = alloca %struct.paddedpackednested, align
732// CHECK-NEXT: bitcast
733// CHECK-NEXT: call void @llvm.memcpy
734// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
735
JF Bastienc70f65e2018-08-07 03:12:52 +0000736TEST_UNINIT(bitfield, bitfield);
737// CHECK-LABEL: @test_bitfield_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000738// CHECK: %uninit = alloca %struct.bitfield, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000739// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000740// PATTERN-LABEL: @test_bitfield_uninit()
741// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_bitfield_uninit.uninit
742// ZERO-LABEL: @test_bitfield_uninit()
743// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +0000744
745TEST_BRACES(bitfield, bitfield);
746// CHECK-LABEL: @test_bitfield_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000747// CHECK: %braces = alloca %struct.bitfield, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000748// CHECK-NEXT: bitcast
749// CHECK-NEXT: call void @llvm.memcpy
750// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
751
752TEST_CUSTOM(bitfield, bitfield, { 4, 1 });
753// CHECK-LABEL: @test_bitfield_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000754// CHECK: %custom = alloca %struct.bitfield, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000755// CHECK-NEXT: bitcast
756// CHECK-NEXT: call void @llvm.memcpy
757// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
758
759TEST_UNINIT(bitfieldaligned, bitfieldaligned);
760// CHECK-LABEL: @test_bitfieldaligned_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000761// CHECK: %uninit = alloca %struct.bitfieldaligned, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000762// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000763// PATTERN-LABEL: @test_bitfieldaligned_uninit()
764// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_bitfieldaligned_uninit.uninit
765// ZERO-LABEL: @test_bitfieldaligned_uninit()
766// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +0000767
768TEST_BRACES(bitfieldaligned, bitfieldaligned);
769// CHECK-LABEL: @test_bitfieldaligned_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000770// CHECK: %braces = alloca %struct.bitfieldaligned, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000771// CHECK-NEXT: bitcast
772// CHECK-NEXT: call void @llvm.memcpy
773// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
774
775TEST_CUSTOM(bitfieldaligned, bitfieldaligned, { 4, 1 });
776// CHECK-LABEL: @test_bitfieldaligned_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000777// CHECK: %custom = alloca %struct.bitfieldaligned, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000778// CHECK-NEXT: bitcast
779// CHECK-NEXT: call void @llvm.memcpy
780// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
781
782TEST_UNINIT(big, big);
783// CHECK-LABEL: @test_big_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000784// CHECK: %uninit = alloca %struct.big, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000785// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000786// PATTERN-LABEL: @test_big_uninit()
787// PATTERN: call void @llvm.memset{{.*}}, i8 -86,
788// ZERO-LABEL: @test_big_uninit()
789// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +0000790
791TEST_BRACES(big, big);
792// CHECK-LABEL: @test_big_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000793// CHECK: %braces = alloca %struct.big, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000794// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000795// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 104, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000796// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
797
798TEST_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 });
799// CHECK-LABEL: @test_big_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000800// CHECK: %custom = alloca %struct.big, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000801// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000802// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 -86, i64 104, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000803// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
804
805TEST_UNINIT(arraytail, arraytail);
806// CHECK-LABEL: @test_arraytail_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000807// CHECK: %uninit = alloca %struct.arraytail, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000808// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000809// PATTERN-LABEL: @test_arraytail_uninit()
810// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_arraytail_uninit.uninit
811// ZERO-LABEL: @test_arraytail_uninit()
812// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +0000813
814TEST_BRACES(arraytail, arraytail);
815// CHECK-LABEL: @test_arraytail_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000816// CHECK: %braces = alloca %struct.arraytail, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000817// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000818// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 4, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000819// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
820
821TEST_CUSTOM(arraytail, arraytail, { 0xdead });
822// CHECK-LABEL: @test_arraytail_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000823// CHECK: %custom = alloca %struct.arraytail, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000824// CHECK-NEXT: bitcast
825// CHECK-NEXT: call void @llvm.memcpy
826// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
827
828
829TEST_UNINIT(int0, int[0]);
830// CHECK-LABEL: @test_int0_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000831// CHECK: %uninit = alloca [0 x i32], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000832// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000833// PATTERN-LABEL: @test_int0_uninit()
834// PATTERN: %uninit = alloca [0 x i32], align
835// PATTERN-NEXT: call void @{{.*}}used{{.*}}%uninit)
836// ZERO-LABEL: @test_int0_uninit()
837// ZERO: %uninit = alloca [0 x i32], align
838// ZERO-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastienc70f65e2018-08-07 03:12:52 +0000839
840TEST_BRACES(int0, int[0]);
841// CHECK-LABEL: @test_int0_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000842// CHECK: %braces = alloca [0 x i32], align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000843// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000844// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 0, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000845// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
846
847TEST_UNINIT(int1, int[1]);
848// CHECK-LABEL: @test_int1_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000849// CHECK: %uninit = alloca [1 x i32], align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000850// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000851// PATTERN-LABEL: @test_int1_uninit()
852// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_int1_uninit.uninit
853// ZERO-LABEL: @test_int1_uninit()
854// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +0000855
856TEST_BRACES(int1, int[1]);
857// CHECK-LABEL: @test_int1_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000858// CHECK: %braces = alloca [1 x i32], align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000859// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000860// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 4, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000861// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
862
863TEST_CUSTOM(int1, int[1], { 0x33333333 });
864// CHECK-LABEL: @test_int1_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000865// CHECK: %custom = alloca [1 x i32], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000866// CHECK-NEXT: bitcast
867// CHECK-NEXT: call void @llvm.memcpy
868// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
869
870TEST_UNINIT(int64, int[64]);
871// CHECK-LABEL: @test_int64_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000872// CHECK: %uninit = alloca [64 x i32], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000873// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000874// PATTERN-LABEL: @test_int64_uninit()
875// PATTERN: call void @llvm.memset{{.*}}, i8 -86,
876// ZERO-LABEL: @test_int64_uninit()
877// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +0000878
879TEST_BRACES(int64, int[64]);
880// CHECK-LABEL: @test_int64_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000881// CHECK: %braces = alloca [64 x i32], align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000882// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000883// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 256, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000884// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
885
886TEST_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 });
887// CHECK-LABEL: @test_int64_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000888// CHECK: %custom = alloca [64 x i32], align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000889// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000890// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 17, i64 256, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000891// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
892
893TEST_UNINIT(bool4, bool[4]);
894// CHECK-LABEL: @test_bool4_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000895// CHECK: %uninit = alloca [4 x i8], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000896// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000897// PATTERN-LABEL: @test_bool4_uninit()
898// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_bool4_uninit.uninit
899// ZERO-LABEL: @test_bool4_uninit()
900// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +0000901
902TEST_BRACES(bool4, bool[4]);
903// CHECK-LABEL: @test_bool4_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000904// CHECK: %braces = alloca [4 x i8], align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000905// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000906// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 4, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000907// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
908
909TEST_CUSTOM(bool4, bool[4], { true, true, true, true });
910// CHECK-LABEL: @test_bool4_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000911// CHECK: %custom = alloca [4 x i8], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000912// CHECK-NEXT: bitcast
913// CHECK-NEXT: call void @llvm.memcpy
914// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
915
916TEST_UNINIT(intptr4, int*[4]);
917// CHECK-LABEL: @test_intptr4_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000918// CHECK: %uninit = alloca [4 x i32*], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000919// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000920// PATTERN-LABEL: @test_intptr4_uninit()
921// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_intptr4_uninit.uninit
922// ZERO-LABEL: @test_intptr4_uninit()
923// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +0000924
925TEST_BRACES(intptr4, int*[4]);
926// CHECK-LABEL: @test_intptr4_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000927// CHECK: %braces = alloca [4 x i32*], align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000928// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000929// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 32, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000930// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
931
932 TEST_CUSTOM(intptr4, int*[4], = { (int*)0x22222222, (int*)0x22222222, (int*)0x22222222, (int*)0x22222222 });
933// CHECK-LABEL: @test_intptr4_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000934// CHECK: %custom = alloca [4 x i32*], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000935// CHECK-NEXT: bitcast
936// CHECK-NEXT: call void @llvm.memcpy
937// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
938
939TEST_UNINIT(tailpad4, tailpad[4]);
940// CHECK-LABEL: @test_tailpad4_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000941// CHECK: %uninit = alloca [4 x %struct.tailpad], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000942// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000943// PATTERN-LABEL: @test_tailpad4_uninit()
944// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_tailpad4_uninit.uninit
945// ZERO-LABEL: @test_tailpad4_uninit()
946// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +0000947
948TEST_BRACES(tailpad4, tailpad[4]);
949// CHECK-LABEL: @test_tailpad4_braces()
JF Bastiencc365c32018-08-07 22:43:44 +0000950// CHECK: %braces = alloca [4 x %struct.tailpad], align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +0000951// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +0000952// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 16, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +0000953// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
954
JF Bastienfe2ea822018-08-08 17:05:17 +0000955TEST_CUSTOM(tailpad4, tailpad[4], { {257, 1}, {257, 1}, {257, 1}, {257, 1} });
JF Bastienc70f65e2018-08-07 03:12:52 +0000956// CHECK-LABEL: @test_tailpad4_custom()
JF Bastiencc365c32018-08-07 22:43:44 +0000957// CHECK: %custom = alloca [4 x %struct.tailpad], align
JF Bastienc70f65e2018-08-07 03:12:52 +0000958// CHECK-NEXT: bitcast
959// CHECK-NEXT: call void @llvm.memcpy
960// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
961
JF Bastienfe2ea822018-08-08 17:05:17 +0000962TEST_UNINIT(tailpad9, tailpad[9]);
963// CHECK-LABEL: @test_tailpad9_uninit()
964// CHECK: %uninit = alloca [9 x %struct.tailpad], align
965// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000966// PATTERN-LABEL: @test_tailpad9_uninit()
967// PATTERN: call void @llvm.memset{{.*}}, i8 -86,
968// ZERO-LABEL: @test_tailpad9_uninit()
969// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienfe2ea822018-08-08 17:05:17 +0000970
971TEST_BRACES(tailpad9, tailpad[9]);
972// CHECK-LABEL: @test_tailpad9_braces()
973// CHECK: %braces = alloca [9 x %struct.tailpad], align [[ALIGN:[0-9]*]]
974// CHECK-NEXT: bitcast
975// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 36, i1 false)
976// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
977
978TEST_CUSTOM(tailpad9, tailpad[9], { {257, 1}, {257, 1}, {257, 1}, {257, 1}, {257, 1}, {257, 1}, {257, 1}, {257, 1}, {257, 1} });
979// CHECK-LABEL: @test_tailpad9_custom()
980// CHECK: %custom = alloca [9 x %struct.tailpad], align [[ALIGN:[0-9]*]]
981// CHECK-NEXT: bitcast
982// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 1, i64 36, i1 false)
983// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
984
JF Bastienc70f65e2018-08-07 03:12:52 +0000985
986TEST_UNINIT(atomicbool, _Atomic(bool));
987// CHECK-LABEL: @test_atomicbool_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000988// CHECK: %uninit = alloca i8, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000989// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000990// PATTERN-LABEL: @test_atomicbool_uninit()
991// PATTERN: store i8 -86, i8* %uninit, align 1
992// ZERO-LABEL: @test_atomicbool_uninit()
993// ZERO: store i8 0, i8* %uninit, align 1
JF Bastienc70f65e2018-08-07 03:12:52 +0000994
995TEST_UNINIT(atomicint, _Atomic(int));
996// CHECK-LABEL: @test_atomicint_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +0000997// CHECK: %uninit = alloca i32, align
JF Bastienc70f65e2018-08-07 03:12:52 +0000998// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +0000999// PATTERN-LABEL: @test_atomicint_uninit()
1000// PATTERN: store i32 -1431655766, i32* %uninit, align 4
1001// ZERO-LABEL: @test_atomicint_uninit()
1002// ZERO: store i32 0, i32* %uninit, align 4
JF Bastienc70f65e2018-08-07 03:12:52 +00001003
1004TEST_UNINIT(atomicdouble, _Atomic(double));
1005// CHECK-LABEL: @test_atomicdouble_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001006// CHECK: %uninit = alloca double, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001007// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001008// PATTERN-LABEL: @test_atomicdouble_uninit()
1009// PATTERN: store double 0xFFFFFFFFFFFFFFFF, double* %uninit, align 8
1010// ZERO-LABEL: @test_atomicdouble_uninit()
1011// ZERO: store double 0.000000e+00, double* %uninit, align 8
JF Bastienc70f65e2018-08-07 03:12:52 +00001012
1013TEST_UNINIT(atomicnotlockfree, _Atomic(notlockfree));
1014// CHECK-LABEL: @test_atomicnotlockfree_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001015// CHECK: %uninit = alloca %struct.notlockfree, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001016// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001017// PATTERN-LABEL: @test_atomicnotlockfree_uninit()
1018// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_atomicnotlockfree_uninit.uninit
1019// ZERO-LABEL: @test_atomicnotlockfree_uninit()
1020// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +00001021
1022TEST_UNINIT(atomicpadded, _Atomic(padded));
1023// CHECK-LABEL: @test_atomicpadded_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001024// CHECK: %uninit = alloca %struct.padded, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001025// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001026// PATTERN-LABEL: @test_atomicpadded_uninit()
1027// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_atomicpadded_uninit.uninit
1028// ZERO-LABEL: @test_atomicpadded_uninit()
1029// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +00001030
1031TEST_UNINIT(atomictailpad, _Atomic(tailpad));
1032// CHECK-LABEL: @test_atomictailpad_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001033// CHECK: %uninit = alloca %struct.tailpad, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001034// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001035// PATTERN-LABEL: @test_atomictailpad_uninit()
1036// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_atomictailpad_uninit.uninit
1037// ZERO-LABEL: @test_atomictailpad_uninit()
1038// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +00001039
1040
1041TEST_UNINIT(complexfloat, _Complex float);
1042// CHECK-LABEL: @test_complexfloat_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001043// CHECK: %uninit = alloca { float, float }, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001044// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001045// PATTERN-LABEL: @test_complexfloat_uninit()
1046// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_complexfloat_uninit.uninit
1047// ZERO-LABEL: @test_complexfloat_uninit()
1048// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +00001049
1050TEST_BRACES(complexfloat, _Complex float);
1051// CHECK-LABEL: @test_complexfloat_braces()
JF Bastiencc365c32018-08-07 22:43:44 +00001052// CHECK: %braces = alloca { float, float }, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001053// CHECK-NEXT: %[[R:[^ ]*]] = getelementptr inbounds { float, float }, { float, float }* %braces, i32 0, i32 0
1054// CHECK-NEXT: %[[I:[^ ]*]] = getelementptr inbounds { float, float }, { float, float }* %braces, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +00001055// CHECK-NEXT: store float 0.000000e+00, float* %[[R]], align [[ALIGN]]
1056// CHECK-NEXT: store float 0.000000e+00, float* %[[I]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001057// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1058
1059TEST_CUSTOM(complexfloat, _Complex float, { 3.1415926535897932384626433, 3.1415926535897932384626433 });
1060// CHECK-LABEL: @test_complexfloat_custom()
JF Bastiencc365c32018-08-07 22:43:44 +00001061// CHECK: %custom = alloca { float, float }, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001062// CHECK-NEXT: %[[R:[^ ]*]] = getelementptr inbounds { float, float }, { float, float }* %custom, i32 0, i32 0
1063// CHECK-NEXT: %[[I:[^ ]*]] = getelementptr inbounds { float, float }, { float, float }* %custom, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +00001064// CHECK-NEXT: store float 0x400921FB60000000, float* %[[R]], align [[ALIGN]]
1065// CHECK-NEXT: store float 0x400921FB60000000, float* %[[I]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001066// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
1067
1068TEST_UNINIT(complexdouble, _Complex double);
1069// CHECK-LABEL: @test_complexdouble_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001070// CHECK: %uninit = alloca { double, double }, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001071// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001072// PATTERN-LABEL: @test_complexdouble_uninit()
1073// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_complexdouble_uninit.uninit
1074// ZERO-LABEL: @test_complexdouble_uninit()
1075// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +00001076
1077TEST_BRACES(complexdouble, _Complex double);
1078// CHECK-LABEL: @test_complexdouble_braces()
JF Bastiencc365c32018-08-07 22:43:44 +00001079// CHECK: %braces = alloca { double, double }, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001080// CHECK-NEXT: %[[R:[^ ]*]] = getelementptr inbounds { double, double }, { double, double }* %braces, i32 0, i32 0
1081// CHECK-NEXT: %[[I:[^ ]*]] = getelementptr inbounds { double, double }, { double, double }* %braces, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +00001082// CHECK-NEXT: store double 0.000000e+00, double* %[[R]], align [[ALIGN]]
1083// CHECK-NEXT: store double 0.000000e+00, double* %[[I]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001084// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1085
1086TEST_CUSTOM(complexdouble, _Complex double, { 3.1415926535897932384626433, 3.1415926535897932384626433 });
1087// CHECK-LABEL: @test_complexdouble_custom()
JF Bastiencc365c32018-08-07 22:43:44 +00001088// CHECK: %custom = alloca { double, double }, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001089// CHECK-NEXT: %[[R:[^ ]*]] = getelementptr inbounds { double, double }, { double, double }* %custom, i32 0, i32 0
1090// CHECK-NEXT: %[[I:[^ ]*]] = getelementptr inbounds { double, double }, { double, double }* %custom, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +00001091// CHECK-NEXT: store double 0x400921FB54442D18, double* %[[R]], align [[ALIGN]]
1092// CHECK-NEXT: store double 0x400921FB54442D18, double* %[[I]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001093// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
1094
1095
1096TEST_UNINIT(volatileint, volatile int);
1097// CHECK-LABEL: @test_volatileint_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001098// CHECK: %uninit = alloca i32, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001099// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001100// PATTERN-LABEL: @test_volatileint_uninit()
1101// PATTERN: store volatile i32 -1431655766, i32* %uninit, align 4
1102// ZERO-LABEL: @test_volatileint_uninit()
1103// ZERO: store volatile i32 0, i32* %uninit, align 4
JF Bastienc70f65e2018-08-07 03:12:52 +00001104
1105TEST_BRACES(volatileint, volatile int);
1106// CHECK-LABEL: @test_volatileint_braces()
JF Bastiencc365c32018-08-07 22:43:44 +00001107// CHECK: %braces = alloca i32, align [[ALIGN:[0-9]*]]
1108// CHECK-NEXT: store volatile i32 0, i32* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001109// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1110
1111TEST_UNINIT(semivolatile, semivolatile);
1112// CHECK-LABEL: @test_semivolatile_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001113// CHECK: %uninit = alloca %struct.semivolatile, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001114// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001115// PATTERN-LABEL: @test_semivolatile_uninit()
1116// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_semivolatile_uninit.uninit
1117// ZERO-LABEL: @test_semivolatile_uninit()
1118// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +00001119
1120TEST_BRACES(semivolatile, semivolatile);
1121// CHECK-LABEL: @test_semivolatile_braces()
JF Bastiencc365c32018-08-07 22:43:44 +00001122// CHECK: %braces = alloca %struct.semivolatile, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001123// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +00001124// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 8, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +00001125// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1126
1127TEST_CUSTOM(semivolatile, semivolatile, { 0x44444444, 0x44444444 });
1128// CHECK-LABEL: @test_semivolatile_custom()
JF Bastiencc365c32018-08-07 22:43:44 +00001129// CHECK: %custom = alloca %struct.semivolatile, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001130// CHECK-NEXT: bitcast
1131// CHECK-NEXT: call void @llvm.memcpy
1132// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
1133
1134TEST_UNINIT(semivolatileinit, semivolatileinit);
1135// CHECK-LABEL: @test_semivolatileinit_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001136// CHECK: %uninit = alloca %struct.semivolatileinit, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001137// CHECK-NEXT: call void @{{.*}}semivolatileinit{{.*}}%uninit)
1138// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
1139
1140TEST_BRACES(semivolatileinit, semivolatileinit);
1141// CHECK-LABEL: @test_semivolatileinit_braces()
JF Bastiencc365c32018-08-07 22:43:44 +00001142// CHECK: %braces = alloca %struct.semivolatileinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001143// CHECK-NEXT: %[[I:[^ ]*]] = getelementptr inbounds %struct.semivolatileinit, %struct.semivolatileinit* %braces, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +00001144// CHECK-NEXT: store i32 286331153, i32* %[[I]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001145// CHECK-NEXT: %[[VI:[^ ]*]] = getelementptr inbounds %struct.semivolatileinit, %struct.semivolatileinit* %braces, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +00001146// CHECK-NEXT: store volatile i32 286331153, i32* %[[VI]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001147// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1148
1149TEST_CUSTOM(semivolatileinit, semivolatileinit, { 0x44444444, 0x44444444 });
1150// CHECK-LABEL: @test_semivolatileinit_custom()
JF Bastiencc365c32018-08-07 22:43:44 +00001151// CHECK: %custom = alloca %struct.semivolatileinit, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001152// CHECK-NEXT: %[[I:[^ ]*]] = getelementptr inbounds %struct.semivolatileinit, %struct.semivolatileinit* %custom, i32 0, i32 0
JF Bastiencc365c32018-08-07 22:43:44 +00001153// CHECK-NEXT: store i32 1145324612, i32* %[[I]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001154// CHECK-NEXT: %[[VI:[^ ]*]] = getelementptr inbounds %struct.semivolatileinit, %struct.semivolatileinit* %custom, i32 0, i32 1
JF Bastiencc365c32018-08-07 22:43:44 +00001155// CHECK-NEXT: store volatile i32 1145324612, i32* %[[VI]], align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001156// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
1157
1158
1159TEST_UNINIT(base, base);
1160// CHECK-LABEL: @test_base_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001161// CHECK: %uninit = alloca %struct.base, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001162// CHECK-NEXT: call void @{{.*}}base{{.*}}%uninit)
1163// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001164// PATTERN-LABEL: @test_base_uninit()
1165// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_base_uninit.uninit
1166// ZERO-LABEL: @test_base_uninit()
1167// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +00001168
1169TEST_BRACES(base, base);
1170// CHECK-LABEL: @test_base_braces()
JF Bastiencc365c32018-08-07 22:43:44 +00001171// CHECK: %braces = alloca %struct.base, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001172// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +00001173// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 8, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +00001174// CHECK-NEXT: call void @{{.*}}base{{.*}}%braces)
1175// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1176
1177TEST_UNINIT(derived, derived);
1178// CHECK-LABEL: @test_derived_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001179// CHECK: %uninit = alloca %struct.derived, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001180// CHECK-NEXT: call void @{{.*}}derived{{.*}}%uninit)
1181// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001182// PATTERN-LABEL: @test_derived_uninit()
1183// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_derived_uninit.uninit
1184// ZERO-LABEL: @test_derived_uninit()
1185// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +00001186
1187TEST_BRACES(derived, derived);
1188// CHECK-LABEL: @test_derived_braces()
JF Bastiencc365c32018-08-07 22:43:44 +00001189// CHECK: %braces = alloca %struct.derived, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001190// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +00001191// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 8, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +00001192// CHECK-NEXT: call void @{{.*}}derived{{.*}}%braces)
1193// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1194
1195TEST_UNINIT(virtualderived, virtualderived);
1196// CHECK-LABEL: @test_virtualderived_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001197// CHECK: %uninit = alloca %struct.virtualderived, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001198// CHECK-NEXT: call void @{{.*}}virtualderived{{.*}}%uninit)
1199// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001200// PATTERN-LABEL: @test_virtualderived_uninit()
1201// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_virtualderived_uninit.uninit
1202// ZERO-LABEL: @test_virtualderived_uninit()
1203// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +00001204
1205TEST_BRACES(virtualderived, virtualderived);
1206// CHECK-LABEL: @test_virtualderived_braces()
JF Bastiencc365c32018-08-07 22:43:44 +00001207// CHECK: %braces = alloca %struct.virtualderived, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001208// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +00001209// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 16, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +00001210// CHECK-NEXT: call void @{{.*}}virtualderived{{.*}}%braces)
1211// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1212
1213
1214TEST_UNINIT(matching, matching);
1215// CHECK-LABEL: @test_matching_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001216// CHECK: %uninit = alloca %union.matching, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001217// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001218// PATTERN-LABEL: @test_matching_uninit()
1219// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_matching_uninit.uninit
1220// ZERO-LABEL: @test_matching_uninit()
1221// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +00001222
1223TEST_BRACES(matching, matching);
1224// CHECK-LABEL: @test_matching_braces()
JF Bastiencc365c32018-08-07 22:43:44 +00001225// CHECK: %braces = alloca %union.matching, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001226// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +00001227// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 4, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +00001228// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1229
1230TEST_CUSTOM(matching, matching, { .f = 0xf00f });
1231// CHECK-LABEL: @test_matching_custom()
JF Bastiencc365c32018-08-07 22:43:44 +00001232// CHECK: %custom = alloca %union.matching, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001233// CHECK-NEXT: bitcast
1234// CHECK-NEXT: call void @llvm.memcpy
1235// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
1236
1237TEST_UNINIT(matchingreverse, matchingreverse);
1238// CHECK-LABEL: @test_matchingreverse_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001239// CHECK: %uninit = alloca %union.matchingreverse, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001240// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001241// PATTERN-LABEL: @test_matchingreverse_uninit()
1242// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_matchingreverse_uninit.uninit
1243// ZERO-LABEL: @test_matchingreverse_uninit()
1244// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +00001245
1246TEST_BRACES(matchingreverse, matchingreverse);
1247// CHECK-LABEL: @test_matchingreverse_braces()
JF Bastiencc365c32018-08-07 22:43:44 +00001248// CHECK: %braces = alloca %union.matchingreverse, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001249// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +00001250// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 4, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +00001251// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1252
1253TEST_CUSTOM(matchingreverse, matchingreverse, { .i = 0xf00f });
1254// CHECK-LABEL: @test_matchingreverse_custom()
JF Bastiencc365c32018-08-07 22:43:44 +00001255// CHECK: %custom = alloca %union.matchingreverse, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001256// CHECK-NEXT: bitcast
1257// CHECK-NEXT: call void @llvm.memcpy
1258// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
1259
1260TEST_UNINIT(unmatched, unmatched);
1261// CHECK-LABEL: @test_unmatched_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001262// CHECK: %uninit = alloca %union.unmatched, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001263// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001264// PATTERN-LABEL: @test_unmatched_uninit()
1265// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_unmatched_uninit.uninit
1266// ZERO-LABEL: @test_unmatched_uninit()
1267// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +00001268
1269TEST_BRACES(unmatched, unmatched);
1270// CHECK-LABEL: @test_unmatched_braces()
JF Bastiencc365c32018-08-07 22:43:44 +00001271// CHECK: %braces = alloca %union.unmatched, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001272// CHECK-NEXT: bitcast
1273// CHECK-NEXT: call void @llvm.memcpy
1274// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1275
1276TEST_CUSTOM(unmatched, unmatched, { .i = 0x3badbeef });
1277// CHECK-LABEL: @test_unmatched_custom()
JF Bastiencc365c32018-08-07 22:43:44 +00001278// CHECK: %custom = alloca %union.unmatched, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001279// CHECK-NEXT: bitcast
1280// CHECK-NEXT: call void @llvm.memcpy
1281// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
1282
1283TEST_UNINIT(unmatchedreverse, unmatchedreverse);
1284// CHECK-LABEL: @test_unmatchedreverse_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001285// CHECK: %uninit = alloca %union.unmatchedreverse, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001286// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001287// PATTERN-LABEL: @test_unmatchedreverse_uninit()
1288// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_unmatchedreverse_uninit.uninit
1289// ZERO-LABEL: @test_unmatchedreverse_uninit()
1290// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +00001291
1292TEST_BRACES(unmatchedreverse, unmatchedreverse);
1293// CHECK-LABEL: @test_unmatchedreverse_braces()
JF Bastiencc365c32018-08-07 22:43:44 +00001294// CHECK: %braces = alloca %union.unmatchedreverse, align [[ALIGN:[0-9]*]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001295// CHECK-NEXT: bitcast
JF Bastiencc365c32018-08-07 22:43:44 +00001296// CHECK-NEXT: call void @llvm.memset{{.*}}(i8* align [[ALIGN]] %{{.*}}, i8 0, i64 4, i1 false)
JF Bastienc70f65e2018-08-07 03:12:52 +00001297// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1298
1299TEST_CUSTOM(unmatchedreverse, unmatchedreverse, { .c = 42 });
1300// CHECK-LABEL: @test_unmatchedreverse_custom()
JF Bastiencc365c32018-08-07 22:43:44 +00001301// CHECK: %custom = alloca %union.unmatchedreverse, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001302// CHECK-NEXT: bitcast
1303// CHECK-NEXT: call void @llvm.memcpy
1304// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
1305
1306TEST_UNINIT(unmatchedfp, unmatchedfp);
1307// CHECK-LABEL: @test_unmatchedfp_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001308// CHECK: %uninit = alloca %union.unmatchedfp, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001309// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001310// PATTERN-LABEL: @test_unmatchedfp_uninit()
1311// PATTERN: call void @llvm.memcpy{{.*}} @__const.test_unmatchedfp_uninit.uninit
1312// ZERO-LABEL: @test_unmatchedfp_uninit()
1313// ZERO: call void @llvm.memset{{.*}}, i8 0,
JF Bastienc70f65e2018-08-07 03:12:52 +00001314
1315TEST_BRACES(unmatchedfp, unmatchedfp);
1316// CHECK-LABEL: @test_unmatchedfp_braces()
JF Bastiencc365c32018-08-07 22:43:44 +00001317// CHECK: %braces = alloca %union.unmatchedfp, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001318// CHECK-NEXT: bitcast
1319// CHECK-NEXT: call void @llvm.memcpy
1320// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1321
1322TEST_CUSTOM(unmatchedfp, unmatchedfp, { .d = 3.1415926535897932384626433 });
1323// CHECK-LABEL: @test_unmatchedfp_custom()
JF Bastiencc365c32018-08-07 22:43:44 +00001324// CHECK: %custom = alloca %union.unmatchedfp, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001325// CHECK-NEXT: bitcast
1326// CHECK-NEXT: call void @llvm.memcpy
1327// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
1328
1329
1330TEST_UNINIT(emptyenum, emptyenum);
1331// CHECK-LABEL: @test_emptyenum_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001332// CHECK: %uninit = alloca i32, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001333// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001334// PATTERN-LABEL: @test_emptyenum_uninit()
1335// PATTERN: store i32 -1431655766, i32* %braces, align 4
1336// ZERO-LABEL: @test_emptyenum_uninit()
1337// ZERO: store i32 0, i32* %braces, align 4
JF Bastienc70f65e2018-08-07 03:12:52 +00001338
1339TEST_BRACES(emptyenum, emptyenum);
1340// CHECK-LABEL: @test_emptyenum_braces()
JF Bastiencc365c32018-08-07 22:43:44 +00001341// CHECK: %braces = alloca i32, align [[ALIGN:[0-9]*]]
1342// CHECK-NEXT: store i32 0, i32* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001343// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1344
1345TEST_CUSTOM(emptyenum, emptyenum, { (emptyenum)42 });
1346// CHECK-LABEL: @test_emptyenum_custom()
JF Bastiencc365c32018-08-07 22:43:44 +00001347// CHECK: %custom = alloca i32, align [[ALIGN:[0-9]*]]
1348// CHECK-NEXT: store i32 42, i32* %custom, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001349// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
1350
1351TEST_UNINIT(smallenum, smallenum);
1352// CHECK-LABEL: @test_smallenum_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001353// CHECK: %uninit = alloca i32, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001354// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001355// PATTERN-LABEL: @test_smallenum_uninit()
1356// PATTERN: store i32 -1431655766, i32* %braces, align 4
1357// ZERO-LABEL: @test_smallenum_uninit()
1358// ZERO: store i32 0, i32* %braces, align 4
JF Bastienc70f65e2018-08-07 03:12:52 +00001359
1360TEST_BRACES(smallenum, smallenum);
1361// CHECK-LABEL: @test_smallenum_braces()
JF Bastiencc365c32018-08-07 22:43:44 +00001362// CHECK: %braces = alloca i32, align [[ALIGN:[0-9]*]]
1363// CHECK-NEXT: store i32 0, i32* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001364// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1365
1366TEST_CUSTOM(smallenum, smallenum, { (smallenum)42 });
1367// CHECK-LABEL: @test_smallenum_custom()
JF Bastiencc365c32018-08-07 22:43:44 +00001368// CHECK: %custom = alloca i32, align [[ALIGN:[0-9]*]]
1369// CHECK-NEXT: store i32 42, i32* %custom, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001370// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
1371
1372
1373TEST_UNINIT(intvec16, int __attribute__((vector_size(16))));
1374// CHECK-LABEL: @test_intvec16_uninit()
JF Bastiencc365c32018-08-07 22:43:44 +00001375// CHECK: %uninit = alloca <4 x i32>, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001376// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001377// PATTERN-LABEL: @test_intvec16_uninit()
1378// PATTERN: store <4 x i32> <i32 -1431655766, i32 -1431655766, i32 -1431655766, i32 -1431655766>, <4 x i32>* %uninit, align 16
1379// ZERO-LABEL: @test_intvec16_uninit()
1380// ZERO: store <4 x i32> zeroinitializer, <4 x i32>* %uninit, align 16
JF Bastienc70f65e2018-08-07 03:12:52 +00001381
1382TEST_BRACES(intvec16, int __attribute__((vector_size(16))));
1383// CHECK-LABEL: @test_intvec16_braces()
JF Bastiencc365c32018-08-07 22:43:44 +00001384// CHECK: %braces = alloca <4 x i32>, align [[ALIGN:[0-9]*]]
1385// CHECK-NEXT: store <4 x i32> zeroinitializer, <4 x i32>* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001386// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1387
JF Bastien14daa202018-12-18 05:12:21 +00001388TEST_CUSTOM(intvec16, int __attribute__((vector_size(16))), { 0x44444444, 0x44444444, 0x44444444, 0x44444444 });
JF Bastienc70f65e2018-08-07 03:12:52 +00001389// CHECK-LABEL: @test_intvec16_custom()
JF Bastiencc365c32018-08-07 22:43:44 +00001390// CHECK: %custom = alloca <4 x i32>, align [[ALIGN:[0-9]*]]
1391// 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 +00001392// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
1393
1394TEST_UNINIT(longlongvec32, long long __attribute__((vector_size(32))));
1395// CHECK-LABEL: @test_longlongvec32_uninit()
JF Bastien81377932018-08-07 04:44:13 +00001396// CHECK: %uninit = alloca <4 x i64>, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001397// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001398// PATTERN-LABEL: @test_longlongvec32_uninit()
1399// PATTERN: store <4 x i64> <i64 -6148914691236517206, i64 -6148914691236517206, i64 -6148914691236517206, i64 -6148914691236517206>, <4 x i64>* %uninit, align 32
1400// ZERO-LABEL: @test_longlongvec32_uninit()
1401// ZERO: store <4 x i64> zeroinitializer, <4 x i64>* %uninit, align 32
JF Bastienc70f65e2018-08-07 03:12:52 +00001402
1403TEST_BRACES(longlongvec32, long long __attribute__((vector_size(32))));
1404// CHECK-LABEL: @test_longlongvec32_braces()
JF Bastien81377932018-08-07 04:44:13 +00001405// CHECK: %braces = alloca <4 x i64>, align [[ALIGN:[0-9]*]]
1406// CHECK-NEXT: store <4 x i64> zeroinitializer, <4 x i64>* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001407// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1408
1409TEST_CUSTOM(longlongvec32, long long __attribute__((vector_size(32))), { 0x3333333333333333, 0x3333333333333333, 0x3333333333333333, 0x3333333333333333 });
1410// CHECK-LABEL: @test_longlongvec32_custom()
JF Bastien81377932018-08-07 04:44:13 +00001411// CHECK: %custom = alloca <4 x i64>, align [[ALIGN:[0-9]*]]
1412// 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 +00001413// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
1414
1415TEST_UNINIT(floatvec16, float __attribute__((vector_size(16))));
1416// CHECK-LABEL: @test_floatvec16_uninit()
JF Bastien81377932018-08-07 04:44:13 +00001417// CHECK: %uninit = alloca <4 x float>, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001418// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001419// PATTERN-LABEL: @test_floatvec16_uninit()
1420// PATTERN: store <4 x float> <float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000, float 0xFFFFFFFFE0000000>, <4 x float>* %uninit, align 16
1421// ZERO-LABEL: @test_floatvec16_uninit()
1422// ZERO: store <4 x float> zeroinitializer, <4 x float>* %uninit, align 16
JF Bastienc70f65e2018-08-07 03:12:52 +00001423
1424TEST_BRACES(floatvec16, float __attribute__((vector_size(16))));
1425// CHECK-LABEL: @test_floatvec16_braces()
JF Bastien81377932018-08-07 04:44:13 +00001426// CHECK: %braces = alloca <4 x float>, align [[ALIGN:[0-9]*]]
1427// CHECK-NEXT: store <4 x float> zeroinitializer, <4 x float>* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001428// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1429
1430TEST_CUSTOM(floatvec16, float __attribute__((vector_size(16))), { 3.1415926535897932384626433, 3.1415926535897932384626433, 3.1415926535897932384626433, 3.1415926535897932384626433 });
1431// CHECK-LABEL: @test_floatvec16_custom()
JF Bastien81377932018-08-07 04:44:13 +00001432// CHECK: %custom = alloca <4 x float>, align [[ALIGN:[0-9]*]]
1433// 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 +00001434// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
1435
1436TEST_UNINIT(doublevec32, double __attribute__((vector_size(32))));
1437// CHECK-LABEL: @test_doublevec32_uninit()
JF Bastien81377932018-08-07 04:44:13 +00001438// CHECK: %uninit = alloca <4 x double>, align
JF Bastienc70f65e2018-08-07 03:12:52 +00001439// CHECK-NEXT: call void @{{.*}}used{{.*}}%uninit)
JF Bastien14daa202018-12-18 05:12:21 +00001440// PATTERN-LABEL: @test_doublevec32_uninit()
1441// PATTERN: store <4 x double> <double 0xFFFFFFFFFFFFFFFF, double 0xFFFFFFFFFFFFFFFF, double 0xFFFFFFFFFFFFFFFF, double 0xFFFFFFFFFFFFFFFF>, <4 x double>* %uninit, align 32
1442// ZERO-LABEL: @test_doublevec32_uninit()
1443// ZERO: store <4 x double> zeroinitializer, <4 x double>* %uninit, align 32
JF Bastienc70f65e2018-08-07 03:12:52 +00001444
1445TEST_BRACES(doublevec32, double __attribute__((vector_size(32))));
1446// CHECK-LABEL: @test_doublevec32_braces()
JF Bastien81377932018-08-07 04:44:13 +00001447// CHECK: %braces = alloca <4 x double>, align [[ALIGN:[0-9]*]]
1448// CHECK-NEXT: store <4 x double> zeroinitializer, <4 x double>* %braces, align [[ALIGN]]
JF Bastienc70f65e2018-08-07 03:12:52 +00001449// CHECK-NEXT: call void @{{.*}}used{{.*}}%braces)
1450
1451TEST_CUSTOM(doublevec32, double __attribute__((vector_size(32))), { 3.1415926535897932384626433, 3.1415926535897932384626433, 3.1415926535897932384626433, 3.1415926535897932384626433 });
1452// CHECK-LABEL: @test_doublevec32_custom()
JF Bastien81377932018-08-07 04:44:13 +00001453// CHECK: %custom = alloca <4 x double>, align [[ALIGN:[0-9]*]]
1454// 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 +00001455// CHECK-NEXT: call void @{{.*}}used{{.*}}%custom)
1456
1457
1458} // extern "C"