1  /* { dg-do run } */
       2  /* { dg-require-effective-target p8vector_hw } */
       3  /* { dg-options "-O2 -ftree-vectorize -mdejagnu-cpu=power8 -fno-vect-cost-model -fdump-tree-vect-details" } */
       4  
       5  /* To test condition reduction vectorization, where comparison operands are of
       6     unsigned long long type and condition true/false values are integer type.  */
       7  
       8  #include <math.h>
       9  
      10  extern void
      11  abort (void) __attribute__ ((noreturn));
      12  
      13  #define N 27
      14  #define FP_TYPE unsigned long long
      15  
      16  __attribute__ ((noinline)) int
      17  test_eq (FP_TYPE *a, FP_TYPE min_v)
      18  {
      19    int last = 0;
      20  
      21    for (int i = 0; i < N; i++)
      22      if (a[i] == min_v)
      23        last = i;
      24  
      25    return last;
      26  }
      27  
      28  __attribute__ ((noinline)) int
      29  test_ne (FP_TYPE *a, FP_TYPE min_v)
      30  {
      31    int last = 0;
      32  
      33    for (int i = 0; i < N; i++)
      34      if (a[i] != min_v)
      35        last = i;
      36  
      37    return last;
      38  }
      39  
      40  __attribute__ ((noinline)) int
      41  test_gt (FP_TYPE *a, FP_TYPE min_v)
      42  {
      43    int last = 0;
      44  
      45    for (int i = 0; i < N; i++)
      46      if (a[i] > min_v)
      47        last = i;
      48  
      49    return last;
      50  }
      51  
      52  __attribute__ ((noinline)) int
      53  test_ge (FP_TYPE *a, FP_TYPE min_v)
      54  {
      55    int last = 0;
      56  
      57    for (int i = 0; i < N; i++)
      58      if (a[i] >= min_v)
      59        last = i;
      60  
      61    return last;
      62  }
      63  
      64  __attribute__ ((noinline)) int
      65  test_lt (FP_TYPE *a, FP_TYPE min_v)
      66  {
      67    int last = 0;
      68  
      69    for (int i = 0; i < N; i++)
      70      if (a[i] < min_v)
      71        last = i;
      72  
      73    return last;
      74  }
      75  
      76  __attribute__ ((noinline)) int
      77  test_le (FP_TYPE *a, FP_TYPE min_v)
      78  {
      79    int last = 0;
      80  
      81    for (int i = 0; i < N; i++)
      82      if (a[i] <= min_v)
      83        last = i;
      84  
      85    return last;
      86  }
      87  
      88  int
      89  main (void)
      90  {
      91    int ret = 0;
      92  
      93    FP_TYPE a1[N] = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1,  2,  3, 4,
      94  		   5,  6,  7,  8,  9,  10, 21, 22, 23, 24, 25, 26, 27};
      95  
      96    FP_TYPE a2[N] = {21, 22, 23, 24, 25, 26, 27, 28, 29, 10, 11, 12, 13, 14,
      97  		   15, 16, 17, 18, 19, 20, 1,  2,  3,  4,  5,  6,  7};
      98  
      99    ret = test_eq (a1, 10);
     100    if (ret != 19)
     101      abort ();
     102  
     103    ret = test_ne (a1, 10);
     104    if (ret != 26)
     105      abort ();
     106  
     107    ret = test_gt (a2, 10);
     108    if (ret != 19)
     109      abort ();
     110  
     111    ret = test_ge (a2, 10);
     112    if (ret != 19)
     113      abort ();
     114  
     115    ret = test_lt (a1, 10);
     116    if (ret != 18)
     117      abort ();
     118  
     119    ret = test_le (a1, 10);
     120    if (ret != 19)
     121      abort ();
     122  
     123    return 0;
     124  }
     125  
     126  /* { dg-final { scan-tree-dump-times "LOOP VECTORIZED" 6 "vect" } } */