blob: 134d32bc505997eac6d8301919f691a89c666430 [file] [log] [blame]
/* PR tree-optimization/93210 */
/* { dg-do run } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
/* { dg-final { scan-tree-dump-times "(?:return|<retval> =) \[0-9]\[0-9a-fA-FxX]*;" 31 "optimized" } } */
#ifdef __SIZEOF_INT128__
typedef unsigned __int128 L;
#else
typedef unsigned long long L;
#endif
struct S { signed char a, b; unsigned char c; };
struct T { signed char d; struct S e[25]; signed char f; };
union U { struct T g; L h[10]; };
const union U u = { { 1, { { 2, 3, 4 }, { 5, 6, 7 }, { 8, 9, 10 },
{ 12, 13, 14 }, { 15, 16, 17 }, { 18, 19, 20 },
{ 22, 23, 24 }, { 25, 26, 27 }, { 28, 29, 30 },
{ 32, 33, 34 }, { 35, 36, 37 }, { 38, 39, 40 },
{ 42, 43, 44 }, { 45, 46, 47 }, { 48, 49, 50 },
{ 52, 53, 54 }, { 55, 56, 57 }, { 58, 59, 60 },
{ 62, 63, 64 }, { 65, 66, 67 }, { 68, 69, 70 },
{ 72, 73, 74 }, { 75, 76, 77 }, { 78, 79, 80 },
{ 82, 83, 84 } }, 85 } };
const union U v = { { 1, { { 2, 3, 4 }, [1 ... 23] = { 5, 6, 7 },
{ 8, 9, 10 } }, 86 } };
struct A { char a[5]; char b[16]; char c[7]; };
union V { struct A d; unsigned int e[10]; };
const union V w = { { "abcde", "ijkl", "mnopqr" } };
#define N(n) __attribute__((noipa)) L foo##n (void) { return u.h[n]; }
#define M N(0) N(1) N(2) N(3) N(4) N(5) N(6) N(7) N(8) N(9)
M
#undef N
#define N(n) __attribute__((noipa)) L bar##n (void) { return v.h[n]; }
M
#undef N
#define N(n) __attribute__((noipa)) L baz##n (void) { return w.e[n]; }
M
typedef L (*F) (void);
F arr[30] = {
#undef N
#define N(n) foo##n,
M
#undef N
#define N(n) bar##n,
M
#undef N
#define N(n) baz##n,
M
};
int
main ()
{
const union U *p = &u;
const union U *q = &v;
const union V *r = &w;
__asm ("" : "+g" (p));
__asm ("" : "+g" (q));
__asm ("" : "+g" (r));
for (int i = 0; i < 10; i++)
if (arr[i] () != p->h[i]
|| arr[i + 10] () != q->h[i]
|| arr[i + 20] () != r->e[i])
__builtin_abort ();
return 0;
}