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        if (b[i] < 100)						\
      18  	a[i] = OP (b[i], x);					\
      19    }
      20  
      21  #define TEST(OP)					\
      22    {							\
      23      f_##OP (a, b, 10);					\
      24      for (int i = 0; i < N; ++i)				\
      25        {							\
      26  	int bval = (i % 17) * 10;			\
      27  	int truev = OP (bval, 10);			\
      28  	if (a[i] != (bval < 100 ? truev : i * 3))	\
      29  	  __builtin_abort ();				\
      30  	asm volatile ("" ::: "memory");			\
      31        }							\
      32    }
      33  
      34  #define FOR_EACH_OP(T)				\
      35    T (add)					\
      36    T (sub)					\
      37    T (mul)					\
      38    T (div)
      39  
      40  FOR_EACH_OP (DEF)
      41  
      42  int
      43  main (void)
      44  {
      45    double a[N], b[N];
      46    for (int i = 0; i < N; ++i)
      47      {
      48        a[i] = i * 3;
      49        b[i] = (i % 17) * 10;
      50        asm volatile ("" ::: "memory");
      51      }
      52    FOR_EACH_OP (TEST)
      53    return 0;
      54  }
      55  
      56  /* { dg-final { scan-tree-dump { = \.COND_ADD} "optimized" { target { vect_double_cond_arith && vect_masked_store } } } } */
      57  /* { dg-final { scan-tree-dump { = \.COND_SUB} "optimized" { target { vect_double_cond_arith && vect_masked_store } } } } */
      58  /* { dg-final { scan-tree-dump { = \.COND_MUL} "optimized" { target { vect_double_cond_arith && vect_masked_store } } } } */
      59  /* { dg-final { scan-tree-dump { = \.COND_RDIV} "optimized" { target { vect_double_cond_arith && vect_masked_store } } } } */
      60  /* { dg-final { scan-tree-dump-not {VEC_COND_EXPR} "optimized" { target { vect_double_cond_arith && vect_masked_store } } } } */