(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vect/
vect-simd-11.c
       1  /* { dg-require-effective-target size32plus } */
       2  /* { dg-additional-options "-fopenmp-simd" } */
       3  /* { dg-additional-options "-mavx" { target avx_runtime } } */
       4  /* { dg-final { scan-tree-dump-times "vectorized \[1-3] loops" 2 "vect" { target i?86-*-* x86_64-*-* } } } */
       5  
       6  #ifndef main
       7  #include "tree-vect.h"
       8  #endif
       9  
      10  int r, a[1024], b[1024];
      11  unsigned short r2, b2[1024];
      12  unsigned char r3, b3[1024];
      13  
      14  __attribute__((noipa)) void
      15  foo (int *a, int *b, unsigned short *b2, unsigned char *b3)
      16  {
      17    #pragma omp simd reduction (inscan, +:r, r2, r3)
      18    for (int i = 0; i < 1024; i++)
      19      {
      20        { r += a[i]; r2 += a[i]; r3 += a[i]; }
      21        #pragma omp scan inclusive(r, r2, r3)
      22        {
      23  	b[i] = r;
      24  	b2[i] = r2;
      25  	b3[i] = r3;
      26        }
      27      }
      28  }
      29  
      30  __attribute__((noipa)) int
      31  bar (unsigned short *s2p, unsigned char *s3p)
      32  {
      33    int s = 0;
      34    unsigned short s2 = 0;
      35    unsigned char s3 = 0;
      36    #pragma omp simd reduction (inscan, +:s, s2, s3)
      37    for (int i = 0; i < 1024; i++)
      38      {
      39        {
      40  	s += 2 * a[i];
      41  	s2 += 2 * a[i];
      42  	s3 += 2 * a[i];
      43        }
      44        #pragma omp scan inclusive(s, s2, s3)
      45        { b[i] = s; b2[i] = s2; b3[i] = s3; }
      46      }
      47    *s2p = s2;
      48    *s3p = s3;
      49    return s;
      50  }
      51  
      52  __attribute__((noipa)) void
      53  baz (int *a, int *b, unsigned short *b2, unsigned char *b3)
      54  {
      55    #pragma omp simd reduction (inscan, +:r, r2, r3) if (simd: 0)
      56    for (int i = 0; i < 1024; i++)
      57      {
      58        {
      59  	r += a[i];
      60  	r2 += a[i];
      61  	r3 += a[i];
      62        }
      63        #pragma omp scan inclusive(r, r2, r3)
      64        {
      65  	b[i] = r;
      66  	b2[i] = r2;
      67  	b3[i] = r3;
      68        }
      69      }
      70  }
      71  
      72  __attribute__((noipa)) int
      73  qux (unsigned short *s2p, unsigned char *s3p)
      74  {
      75    int s = 0;
      76    unsigned short s2 = 0;
      77    unsigned char s3 = 0;
      78    #pragma omp simd reduction (inscan, +:s, s2, s3) simdlen (1)
      79    for (int i = 0; i < 1024; i++)
      80      {
      81        { s += 2 * a[i]; s2 += 2 * a[i]; s3 += 2 * a[i]; }
      82        #pragma omp scan inclusive(s, s2, s3)
      83        { b[i] = s; b2[i] = s2; b3[i] = s3; }
      84      }
      85    *s2p = s2;
      86    *s3p = s3;
      87    return s;
      88  }
      89  
      90  int
      91  main ()
      92  {
      93    int s = 0;
      94    unsigned short s2;
      95    unsigned char s3;
      96  #ifndef main
      97    check_vect ();
      98  #endif
      99    for (int i = 0; i < 1024; ++i)
     100      {
     101        a[i] = i;
     102        b[i] = -1;
     103        b2[i] = -1;
     104        b3[i] = -1;
     105        asm ("" : "+g" (i));
     106      }
     107    foo (a, b, b2, b3);
     108    if (r != 1024 * 1023 / 2
     109        || r2 != (unsigned short) r
     110        || r3 != (unsigned char) r)
     111      abort ();
     112    for (int i = 0; i < 1024; ++i)
     113      {
     114        s += i;
     115        if (b[i] != s
     116  	  || b2[i] != (unsigned short) s
     117  	  || b3[i] != (unsigned char) s)
     118  	abort ();
     119        else
     120  	{
     121  	  b[i] = 25;
     122  	  b2[i] = 24;
     123  	  b3[i] = 26;
     124  	}
     125      }
     126    if (bar (&s2, &s3) != 1024 * 1023)
     127      abort ();
     128    if (s2 != (unsigned short) (1024 * 1023)
     129        || s3 != (unsigned char) (1024 * 1023))
     130      abort ();
     131    s = 0;
     132    for (int i = 0; i < 1024; ++i)
     133      {
     134        s += 2 * i;
     135        if (b[i] != s
     136  	  || b2[i] != (unsigned short) s
     137  	  || b3[i] != (unsigned char) s)
     138  	abort ();
     139        else
     140  	{
     141  	  b[i] = -1;
     142  	  b2[i] = -1;
     143  	  b3[i] = -1;
     144  	}
     145      }
     146    r = 0;
     147    r2 = 0;
     148    r3 = 0;
     149    baz (a, b, b2, b3);
     150    if (r != 1024 * 1023 / 2
     151        || r2 != (unsigned short) r
     152        || r3 != (unsigned char) r)
     153      abort ();
     154    s = 0;
     155    for (int i = 0; i < 1024; ++i)
     156      {
     157        s += i;
     158        if (b[i] != s
     159  	  || b2[i] != (unsigned short) s
     160  	  || b3[i] != (unsigned char) s)
     161  	abort ();
     162        else
     163  	{
     164  	  b[i] = 25;
     165  	  b2[i] = 24;
     166  	  b3[i] = 26;
     167  	}
     168      }
     169    s2 = 0;
     170    s3 = 0;
     171    if (qux (&s2, &s3) != 1024 * 1023)
     172      abort ();
     173    if (s2 != (unsigned short) (1024 * 1023)
     174        || s3 != (unsigned char) (1024 * 1023))
     175      abort ();
     176    s = 0;
     177    for (int i = 0; i < 1024; ++i)
     178      {
     179        s += 2 * i;
     180        if (b[i] != s
     181  	  || b2[i] != (unsigned short) s
     182  	  || b3[i] != (unsigned char) s)
     183  	abort ();
     184      }
     185    return 0;
     186  }