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