1  /* { dg-additional-options "-fdump-tree-optimized" } */
       2  
       3  #include "tree-vect.h"
       4  
       5  #define N (VECTOR_BITS * 11 / 64 + 3)
       6  
       7  #define add(A, B) ((A) + (B))
       8  #define sub(A, B) ((A) - (B))
       9  #define mul(A, B) ((A) * (B))
      10  #define div(A, B) ((A) / (B))
      11  
      12  #define DEF(OP)							\
      13    void __attribute__ ((noipa))					\
      14    f_##OP (double *restrict a, double *restrict b, double x)	\
      15    {								\
      16      for (int i = 0; i < N; ++i)					\
      17        a[i] = b[i] < 100 ? OP (b[i], x) : b[i];			\
      18    }
      19  
      20  #define TEST(OP)					\
      21    {							\
      22      f_##OP (a, b, 10);					\
      23      for (int i = 0; i < N; ++i)				\
      24        {							\
      25  	int bval = (i % 17) * 10;			\
      26  	int truev = OP (bval, 10);			\
      27  	if (a[i] != (bval < 100 ? truev : bval))	\
      28  	__builtin_abort ();				\
      29  	asm volatile ("" ::: "memory");			\
      30        }							\
      31    }
      32  
      33  #define FOR_EACH_OP(T)				\
      34    T (add)					\
      35    T (sub)					\
      36    T (mul)					\
      37    T (div)
      38  
      39  FOR_EACH_OP (DEF)
      40  
      41  int
      42  main (void)
      43  {
      44    double a[N], b[N];
      45    for (int i = 0; i < N; ++i)
      46      {
      47        b[i] = (i % 17) * 10;
      48        asm volatile ("" ::: "memory");
      49      }
      50    FOR_EACH_OP (TEST)
      51    return 0;
      52  }
      53  
      54  /* { dg-final { scan-tree-dump { = \.COND_ADD} "optimized" { target vect_double_cond_arith } } } */
      55  /* { dg-final { scan-tree-dump { = \.COND_SUB} "optimized" { target vect_double_cond_arith } } } */
      56  /* { dg-final { scan-tree-dump { = \.COND_MUL} "optimized" { target vect_double_cond_arith } } } */
      57  /* { dg-final { scan-tree-dump { = \.COND_RDIV} "optimized" { target vect_double_cond_arith } } } */
      58  /* { dg-final { scan-tree-dump-not {VEC_COND_EXPR} "optimized" { target vect_double_cond_arith } } } */