| /* { dg-do run } */ |
| |
| struct FOO { |
| double a; |
| double b; |
| double c; |
| }; |
| |
| double __attribute__((noipa)) |
| sum_8_foos(const struct FOO* foos) |
| { |
| double sum = 0; |
| |
| for (int i = 0; i < 8; ++i) |
| { |
| struct FOO foo = foos[i]; |
| |
| /* Need to use an in-order reduction here, preserving |
| the load permutation. */ |
| sum += foo.a; |
| sum += foo.c; |
| sum += foo.b; |
| } |
| |
| return sum; |
| } |
| |
| int main() |
| { |
| struct FOO foos[8]; |
| |
| __builtin_memset (foos, 0, sizeof (foos)); |
| foos[0].a = __DBL_MAX__; |
| foos[0].b = 5; |
| foos[0].c = -__DBL_MAX__; |
| |
| if (sum_8_foos (foos) != 5) |
| __builtin_abort (); |
| return 0; |
| } |