| /* PR tree-optimization/92618 */ |
| |
| typedef long long __m128i __attribute__((__vector_size__(2 * sizeof (long long)),__may_alias__)); |
| |
| double a[4]; |
| unsigned long long b[4]; |
| |
| __attribute__((noipa)) __m128i |
| bar (void) |
| { |
| static int cnt; |
| cnt += 2; |
| return (__m128i) { cnt, cnt + 1 }; |
| } |
| |
| #if __SIZEOF_LONG_LONG__ == __SIZEOF_DOUBLE__ |
| typedef double __m128d __attribute__((__vector_size__(2 * sizeof (double)),__may_alias__)); |
| |
| __attribute__((noipa)) __m128i |
| qux (void) |
| { |
| static double cnt; |
| cnt += 2.0; |
| return (__m128i) (__m128d) { cnt, cnt + 1.0 }; |
| } |
| #endif |
| |
| void |
| foo (unsigned long long *x) |
| { |
| __m128i c = bar (); |
| __m128i d = bar (); |
| *(__m128i *) &b[0] = c; |
| *(__m128i *) &b[2] = d; |
| *x = b[0] + b[1] + b[2] + b[3]; |
| } |
| |
| void |
| baz (double *x) |
| { |
| #if __SIZEOF_LONG_LONG__ == __SIZEOF_DOUBLE__ |
| __m128i c = qux (); |
| __m128i d = qux (); |
| *(__m128i *) &a[0] = c; |
| *(__m128i *) &a[2] = d; |
| *x = a[0] + a[1] + a[2] + a[3]; |
| #endif |
| } |
| |
| int |
| main () |
| { |
| unsigned long long c = 0; |
| foo (&c); |
| if (c != 2 + 3 + 4 + 5) |
| __builtin_abort (); |
| #if __SIZEOF_LONG_LONG__ == __SIZEOF_DOUBLE__ |
| double d = 0.0; |
| baz (&d); |
| if (d != 2.0 + 3.0 + 4.0 + 5.0) |
| __builtin_abort (); |
| #endif |
| } |