(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vect/
vect-cond-8.c
       1  /* { dg-require-effective-target vect_cond_mixed } */
       2  /* { dg-require-effective-target vect_float } */
       3  
       4  #include "tree-vect.h"
       5  
       6  #define N 1024
       7  float a[N], b[N], c[N];
       8  int d[N], e[N], f[N];
       9  unsigned char k[N];
      10  
      11  __attribute__((noinline, noclone)) void
      12  f1 (void)
      13  {
      14    int i;
      15    for (i = 0; i < N; ++i)
      16      k[i] = a[i] < b[i] ? 17 : 0;
      17  }
      18  
      19  __attribute__((noinline, noclone)) void
      20  f2 (void)
      21  {
      22    int i;
      23    for (i = 0; i < N; ++i)
      24      k[i] = a[i] < b[i] ? 0 : 24;
      25  }
      26  
      27  __attribute__((noinline, noclone)) void
      28  f3 (void)
      29  {
      30    int i;
      31    for (i = 0; i < N; ++i)
      32      k[i] = a[i] < b[i] ? 51 : 12;
      33  }
      34  
      35  __attribute__((noinline, noclone)) void
      36  f4 (void)
      37  {
      38    int i;
      39    for (i = 0; i < N; ++i)
      40      {
      41        int d2 = d[i], e2 = e[i];
      42        f[i] = a[i] < b[i] ? d2 : e2;
      43      }
      44  }
      45  
      46  __attribute__((noinline, noclone)) void
      47  f5 (void)
      48  {
      49    int i;
      50    for (i = 0; i < N; ++i)
      51      {
      52        float a2 = a[i], b2 = b[i];
      53        c[i] = d[i] < e[i] ? a2 : b2;
      54      }
      55  }
      56  
      57  int
      58  main ()
      59  {
      60    int i;
      61  
      62    check_vect ();
      63  
      64    for (i = 0; i < N; i++)
      65      {
      66        switch (i % 9)
      67  	{
      68  	case 0: asm (""); a[i] = - i - 1; b[i] = i + 1; break;
      69  	case 1: a[i] = 0; b[i] = 0; break;
      70  	case 2: a[i] = i + 1; b[i] = - i - 1; break;
      71  	case 3: a[i] = i; b[i] = i + 7; break;
      72  	case 4: a[i] = i; b[i] = i; break;
      73  	case 5: a[i] = i + 16; b[i] = i + 3; break;
      74  	case 6: a[i] = - i - 5; b[i] = - i; break;
      75  	case 7: a[i] = - i; b[i] = - i; break;
      76  	case 8: a[i] = - i; b[i] = - i - 7; break;
      77  	}
      78        d[i] = i;
      79        e[i] = 2 * i;
      80      }
      81    f1 ();
      82    for (i = 0; i < N; i++)
      83      if (k[i] != ((i % 3) == 0 ? 17 : 0))
      84        abort ();
      85    f2 ();
      86    for (i = 0; i < N; i++)
      87      if (k[i] != ((i % 3) == 0 ? 0 : 24))
      88        abort ();
      89    f3 ();
      90    for (i = 0; i < N; i++)
      91      if (k[i] != ((i % 3) == 0 ? 51 : 12))
      92        abort ();
      93    f4 ();
      94    for (i = 0; i < N; i++)
      95      if (f[i] != ((i % 3) == 0 ? d[i] : e[i]))
      96        abort ();
      97    for (i = 0; i < N; i++)
      98      {
      99        switch (i % 9)
     100  	{
     101  	case 0: asm (""); d[i] = - i - 1; e[i] = i + 1; break;
     102  	case 1: d[i] = 0; e[i] = 0; break;
     103  	case 2: d[i] = i + 1; e[i] = - i - 1; break;
     104  	case 3: d[i] = i; e[i] = i + 7; break;
     105  	case 4: d[i] = i; e[i] = i; break;
     106  	case 5: d[i] = i + 16; e[i] = i + 3; break;
     107  	case 6: d[i] = - i - 5; e[i] = - i; break;
     108  	case 7: d[i] = - i; e[i] = - i; break;
     109  	case 8: d[i] = - i; e[i] = - i - 7; break;
     110  	}
     111        a[i] = i;
     112        b[i] = i / 2;
     113      }
     114    f5 ();
     115    for (i = 0; i < N; i++)
     116      if (c[i] != ((i % 3) == 0 ? a[i] : b[i]))
     117        abort ();
     118  
     119    return 0;
     120  }
     121  
     122  /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 5 "vect" } } */