(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vect/
no-vfa-vect-depend-3.c
       1  /* { dg-require-effective-target vect_int } */
       2  
       3  #include <stdarg.h>
       4  #include "tree-vect.h"
       5  
       6  #define N 64
       7  
       8  int ia[N + 1];
       9  int ib[N + 1];
      10  
      11  /* Vectorizable. Dependence distance -1.  */
      12  __attribute__((noinline)) void
      13  f1 (void)
      14  {
      15    int i;
      16    for (i = 0; i < N; i++)
      17      {
      18        ia[i + 1] = 1;
      19        ib[i] = ia[i];
      20      }
      21  }
      22  
      23  /* Not vectorizable due to data dependence: dependence distance 1.  */
      24  __attribute__((noinline)) void
      25  f2 (void)
      26  {
      27    int i;
      28    for (i = 0; i < N; i++)
      29      {
      30        ia[i] = 1;
      31        ib[i] = ia[i + 1];
      32      }
      33  }
      34  
      35  /* Not vectorizable due to data dependence: dependence distance 1.  */
      36  __attribute__((noinline)) void
      37  f3 (void)
      38  {
      39    int i;
      40    for (i = N - 1; i >= 0; i--)
      41      {
      42        ia[i + 1] = 1;
      43        ib[i] = ia[i];
      44      }
      45  }
      46  
      47  /* Vectorizable. Dependence distance -1.  */
      48  __attribute__((noinline)) void
      49  f4 (void)
      50  {
      51    int i;
      52    for (i = N - 1; i >= 0; i--)
      53      {
      54        ia[i] = 1;
      55        ib[i] = ia[i + 1];
      56      }
      57  }
      58  
      59  /* Vectorizable. Dependence distance -1.  */
      60  __attribute__((noinline)) void
      61  f5 (void)
      62  {
      63    int i;
      64    for (i = 0; i < N; i++)
      65      {
      66        ia[i + 1] = 1;
      67        ia[i] = 2;
      68      }
      69  }
      70  
      71  /* Not vectorizable due to data dependence: dependence distance 1.  */
      72  __attribute__((noinline)) void
      73  f6 (void)
      74  {
      75    int i;
      76    for (i = 0; i < N; i++)
      77      {
      78        ia[i] = 1;
      79        ia[i + 1] = 2;
      80      }
      81  }
      82  
      83  /* Not vectorizable due to data dependence: dependence distance 1.  */
      84  __attribute__((noinline)) void
      85  f7 (void)
      86  {
      87    int i;
      88    for (i = N - 1; i >= 0; i--)
      89      {
      90        ia[i + 1] = 1;
      91        ia[i] = 2;
      92      }
      93  }
      94  
      95  /* Vectorizable. Dependence distance -1.  */
      96  __attribute__((noinline)) void
      97  f8 (void)
      98  {
      99    int i;
     100    for (i = N - 1; i >= 0; i--)
     101      {
     102        ia[i] = 1;
     103        ia[i + 1] = 2;
     104      }
     105  }
     106  
     107  __attribute__ ((noinline)) int
     108  main1 (void)
     109  {
     110    int i, j;
     111  
     112    for (j = 0; j < 8; j++)
     113      {
     114        for (i = 0; i <= N; i++)
     115  	{
     116  	  ia[i] = i + 3;
     117  	  ib[i] = i + N + 3;
     118  	  asm ("");
     119  	}
     120  
     121        switch (j)
     122  	{
     123  	case 0: f1 (); break;
     124  	case 1: f2 (); break;
     125  	case 2: f3 (); break;
     126  	case 3: f4 (); break;
     127  	case 4: f5 (); break;
     128  	case 5: f6 (); break;
     129  	case 6: f7 (); break;
     130  	case 7: f8 (); break;
     131  	}
     132  
     133        for (i = 0; i <= N; i++)
     134  	{
     135  	  int ea = i + 3;
     136  	  int eb = i + N + 3;
     137  	  switch (j)
     138  	    {
     139  	    case 0:
     140  	      if (i) ea = 1;
     141  	      if (i == 0) eb = 3;
     142  	      else if (i != N) eb = 1;
     143  	      break;
     144  	    case 1:
     145  	      if (i != N) ea = 1;
     146  	      if (i != N) eb = i + 4;
     147  	      break;
     148  	    case 2:
     149  	      if (i) ea = 1;
     150  	      if (i != N) eb = i + 3;
     151  	      break;
     152  	    case 3:
     153  	      if (i != N) ea = 1;
     154  	      if (i < N - 1) eb = 1;
     155  	      else if (i == N - 1) eb = 67;
     156  	      break;
     157  	    case 4:
     158  	      ea = 1 + (i != N);
     159  	      break;
     160  	    case 5:
     161  	      ea = 2 - (i != N);
     162  	      break;
     163  	    case 6:
     164  	      ea = 1 + (i == 0);
     165  	      break;
     166  	    case 7:
     167  	      ea = 2 - (i == 0);
     168  	      break;
     169  	    }
     170  	  if (ia[i] != ea || ib[i] != eb)
     171  	    abort ();
     172  	}
     173      }
     174  
     175    return 0;
     176  }
     177  
     178  int main ()
     179  {
     180    check_vect ();
     181  
     182    return main1 ();
     183  }
     184  
     185  /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 4 "vect" {xfail { vect_no_align && { ! vect_hw_misalign } } } } } */
     186  /* { dg-final { scan-tree-dump-times "dependence distance negative" 4 "vect" } } */