| /* PR tree-optimization/60823 */ |
| /* { dg-do run } */ |
| /* { dg-require-effective-target vect_simd_clones } */ |
| /* { dg-options "-O2 -fopenmp-simd" } */ |
| |
| #pragma omp declare simd simdlen(4) notinbranch |
| __attribute__((noinline)) int |
| foo (double c1, double c2) |
| { |
| double z1 = c1, z2 = c2; |
| int res = 100, i; |
| |
| for (i = 0; i < 5; i++) |
| { |
| res = (z1 * z1 + z2 * z2 > 4.0) ? (i < res ? i : res) : res; |
| z1 = c1 + z1 * z1 - z2 * z2; |
| z2 = c2 + 2.0 * z1 * z2; |
| c1 += 0.5; |
| c2 += 0.5; |
| } |
| return res; |
| } |
| |
| __attribute__((noinline, noclone)) void |
| bar (double *x, double *y) |
| { |
| asm volatile ("" : : "rm" (x), "rm" (y) : "memory"); |
| } |
| |
| int |
| main () |
| { |
| int i; |
| double c[4] = { 0.0, 1.0, 0.0, 1.0 }; |
| double d[4] = { 0.0, 1.0, 2.0, 0.0 }; |
| int e[4]; |
| bar (c, d); |
| #pragma omp simd safelen(4) |
| for (i = 0; i < 4; i++) |
| e[i] = foo (c[i], d[i]); |
| if (e[0] != 3 || e[1] != 1 || e[2] != 1 || e[3] != 2) |
| __builtin_abort (); |
| return 0; |
| } |