145
|
1 /* PR tree-optimization/92618 */
|
|
2
|
|
3 typedef long long __m128i __attribute__((__may_alias__, __vector_size__(2 * sizeof (long long))));
|
|
4
|
|
5 double a[4];
|
|
6 unsigned long long b[4];
|
|
7
|
|
8 __attribute__((noipa)) __m128i
|
|
9 bar (void)
|
|
10 {
|
|
11 static int cnt;
|
|
12 cnt += 2;
|
|
13 return (__m128i) { cnt, cnt + 1 };
|
|
14 }
|
|
15
|
|
16 #if __SIZEOF_LONG_LONG__ == __SIZEOF_DOUBLE__
|
|
17 typedef double __m128d __attribute__((__may_alias__, __vector_size__(2 * sizeof (double))));
|
|
18
|
|
19 __attribute__((noipa)) __m128i
|
|
20 qux (void)
|
|
21 {
|
|
22 static double cnt;
|
|
23 cnt += 2.0;
|
|
24 return (__m128i) (__m128d) { cnt, cnt + 1.0 };
|
|
25 }
|
|
26 #endif
|
|
27
|
|
28 void
|
|
29 foo (unsigned long long *x)
|
|
30 {
|
|
31 __m128i c = bar ();
|
|
32 __m128i d = bar ();
|
|
33 *(__m128i *) &b[0] = c;
|
|
34 *(__m128i *) &b[2] = d;
|
|
35 *x = b[0] + b[1] + b[2] + b[3];
|
|
36 }
|
|
37
|
|
38 void
|
|
39 baz (double *x)
|
|
40 {
|
|
41 #if __SIZEOF_LONG_LONG__ == __SIZEOF_DOUBLE__
|
|
42 __m128i c = qux ();
|
|
43 __m128i d = qux ();
|
|
44 *(__m128i *) &a[0] = c;
|
|
45 *(__m128i *) &a[2] = d;
|
|
46 *x = a[0] + a[1] + a[2] + a[3];
|
|
47 #endif
|
|
48 }
|
|
49
|
|
50 int
|
|
51 main ()
|
|
52 {
|
|
53 unsigned long long c = 0;
|
|
54 foo (&c);
|
|
55 if (c != 2 + 3 + 4 + 5)
|
|
56 __builtin_abort ();
|
|
57 #if __SIZEOF_LONG_LONG__ == __SIZEOF_DOUBLE__
|
|
58 double d = 0.0;
|
|
59 baz (&d);
|
|
60 if (d != 2.0 + 3.0 + 4.0 + 5.0)
|
|
61 __builtin_abort ();
|
|
62 #endif
|
|
63 }
|