mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			61 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
| /* { dg-do run } */
 | |
| 
 | |
| #include <omp.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| 
 | |
| int
 | |
| main (int argc, char **argv[])
 | |
| {
 | |
|   int n = argc < 5 ? 12 : 31, i, m, l;
 | |
|   char a[n + 3];
 | |
|   unsigned short b[n / 2 - 1];
 | |
|   int c[n * 2 + 1];
 | |
| 
 | |
|   for (i = 0; i < n + 3; i++)
 | |
|     a[i] = i;
 | |
|   for (i = 0; i < n / 2 - 1; i++)
 | |
|     b[i] = (i << 8) | i;
 | |
|   for (i = 0; i < n * 2 + 1; i++)
 | |
|     c[i] = (i << 24) | i;
 | |
|   l = 0;
 | |
|   m = n;
 | |
| #pragma omp parallel default (shared) num_threads (4) \
 | |
|   firstprivate (a, m) private (b, i) reduction (+:l)
 | |
|   {
 | |
|     for (i = 0; i < m + 3; i++)
 | |
|       if (a[i] != i)
 | |
| 	l++;
 | |
|     for (i = 0; i < m * 2 + 1; i++)
 | |
|       if (c[i] != ((i << 24) | i))
 | |
| 	l++;
 | |
| #pragma omp barrier
 | |
|     memset (a, omp_get_thread_num (), m + 3);
 | |
|     for (i = 0; i < m / 2 - 1; i++)
 | |
|       b[i] = a[0] + 7;
 | |
| #pragma omp master
 | |
|     {
 | |
|       for (i = 0; i < m * 2 + 1; i++)
 | |
| 	c[i] = a[0] + 16;
 | |
|     }
 | |
| #pragma omp barrier
 | |
|     if (a[0] != omp_get_thread_num ())
 | |
|       l++;
 | |
|     for (i = 1; i < m + 3; i++)
 | |
|       if (a[i] != a[0])
 | |
| 	l++;
 | |
|     for (i = 0; i < m / 2 - 1; i++)
 | |
|       if (b[i] != a[0] + 7)
 | |
| 	l++;
 | |
|     for (i = 0; i < m * 2 + 1; i++)
 | |
|       if (c[i] != 16)
 | |
| 	l++;
 | |
|   }
 | |
|   if (l)
 | |
|     abort ();
 | |
|   for (i = 0; i < n * 2 + 1; i++)
 | |
|     if (c[i] != 16)
 | |
|       l++;
 | |
|   return 0;
 | |
| }
 |