(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vect/
bb-slp-pr81635-1.c
       1  /* { dg-do compile } */
       2  /* { dg-additional-options "-fno-tree-loop-vectorize" } */
       3  /* { dg-require-effective-target vect_double } */
       4  /* { dg-require-effective-target lp64 } */
       5  
       6  void
       7  f1 (double *p, double *q)
       8  {
       9    p = (double *) __builtin_assume_aligned (p, sizeof (double) * 2);
      10    q = (double *) __builtin_assume_aligned (q, sizeof (double) * 2);
      11    for (unsigned int i = 0; i < 1000; i += 4)
      12      {
      13        double a = q[i] + p[i];
      14        double b = q[i + 1] + p[i + 1];
      15        q[i] = a;
      16        q[i + 1] = b;
      17      }
      18  }
      19  
      20  void
      21  f2 (double *p, double *q)
      22  {
      23    p = (double *) __builtin_assume_aligned (p, sizeof (double) * 2);
      24    q = (double *) __builtin_assume_aligned (q, sizeof (double) * 2);
      25    for (unsigned int i = 2; i < ~0U - 4; i += 4)
      26      {
      27        double a = q[i] + p[i];
      28        double b = q[i + 1] + p[i + 1];
      29        q[i] = a;
      30        q[i + 1] = b;
      31      }
      32  }
      33  
      34  void
      35  f3 (double *p, double *q)
      36  {
      37    p = (double *) __builtin_assume_aligned (p, sizeof (double) * 2);
      38    q = (double *) __builtin_assume_aligned (q, sizeof (double) * 2);
      39    for (unsigned int i = 0; i < ~0U - 3; i += 4)
      40      {
      41        double a = q[i + 2] + p[i + 2];
      42        double b = q[i + 3] + p[i + 3];
      43        q[i + 2] = a;
      44        q[i + 3] = b;
      45      }
      46  }
      47  
      48  void
      49  f4 (double *p, double *q)
      50  {
      51    p = (double *) __builtin_assume_aligned (p, sizeof (double) * 2);
      52    q = (double *) __builtin_assume_aligned (q, sizeof (double) * 2);
      53    for (unsigned int i = 0; i < 500; i += 6)
      54      for (unsigned int j = 0; j < 500; j += 4)
      55        {
      56  	double a = q[j] + p[i];
      57  	double b = q[j + 1] + p[i + 1];
      58  	q[i] = a;
      59  	q[i + 1] = b;
      60        }
      61  }
      62  
      63  void
      64  f5 (double *p, double *q)
      65  {
      66    p = (double *) __builtin_assume_aligned (p, sizeof (double) * 2);
      67    q = (double *) __builtin_assume_aligned (q, sizeof (double) * 2);
      68    for (unsigned int i = 2; i < 1000; i += 4)
      69      {
      70        double a = q[i - 2] + p[i - 2];
      71        double b = q[i - 1] + p[i - 1];
      72        q[i - 2] = a;
      73        q[i - 1] = b;
      74      }
      75  }
      76  
      77  double p[1000];
      78  double q[1000];
      79  
      80  void
      81  f6 (int n)
      82  {
      83    for (unsigned int i = 0; i < n; i += 4)
      84      {
      85        double a = q[i] + p[i];
      86        double b = q[i + 1] + p[i + 1];
      87        q[i] = a;
      88        q[i + 1] = b;
      89      }
      90  }
      91  
      92  /* { dg-final { scan-tree-dump-times "optimized: basic block" 6 "slp1" } } */