/* { dg-additional-options "-fdump-tree-optimized" } */ #include "tree-vect.h" #define N (VECTOR_BITS * 11 / 64 + 3) #define add(A, B) ((A) + (B)) #define sub(A, B) ((A) - (B)) #define mul(A, B) ((A) * (B)) #define div(A, B) ((A) / (B)) #define DEF(OP) \ void __attribute__ ((noipa)) \ f_##OP (double *restrict a, double *restrict b, double x) \ { \ for (int i = 0; i < N; ++i) \ a[i] = b[i] < 100 ? OP (b[i], x) : b[i]; \ } #define TEST(OP) \ { \ f_##OP (a, b, 10); \ for (int i = 0; i < N; ++i) \ { \ int bval = (i % 17) * 10; \ int truev = OP (bval, 10); \ if (a[i] != (bval < 100 ? truev : bval)) \ __builtin_abort (); \ asm volatile ("" ::: "memory"); \ } \ } #define FOR_EACH_OP(T) \ T (add) \ T (sub) \ T (mul) \ T (div) FOR_EACH_OP (DEF) int main (void) { double a[N], b[N]; for (int i = 0; i < N; ++i) { b[i] = (i % 17) * 10; asm volatile ("" ::: "memory"); } FOR_EACH_OP (TEST) return 0; } /* { dg-final { scan-tree-dump { = \.COND_ADD} "optimized" { target vect_double_cond_arith } } } */ /* { dg-final { scan-tree-dump { = \.COND_SUB} "optimized" { target vect_double_cond_arith } } } */ /* { dg-final { scan-tree-dump { = \.COND_MUL} "optimized" { target vect_double_cond_arith } } } */ /* { dg-final { scan-tree-dump { = \.COND_RDIV} "optimized" { target vect_double_cond_arith } } } */ /* { dg-final { scan-tree-dump-not {VEC_COND_EXPR} "optimized" { target vect_double_cond_arith } } } */