mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			66 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
| /* { dg-do run } */
 | |
| /* { dg-options "-O2" } */
 | |
| /* { dg-additional-options "-std=c99" { target c } } */
 | |
| /* { dg-additional-options "-msse2" { target sse2_runtime } } */
 | |
| /* { dg-additional-options "-mavx" { target avx_runtime } } */
 | |
| 
 | |
| #include <omp.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| #define N 1024
 | |
| long int u[N], m, n, o;
 | |
| 
 | |
| __attribute__((noipa)) void
 | |
| foo (void)
 | |
| {
 | |
|   int i = -1;
 | |
|   #pragma omp master taskloop simd reduction (+:m) grainsize (64)
 | |
|   for (i = 0; i < N; ++i)
 | |
|     m += u[i];
 | |
|   if (i != (omp_get_thread_num () ? -1 : N))
 | |
|     abort ();
 | |
| }
 | |
| 
 | |
| __attribute__((noipa)) void
 | |
| bar (int x)
 | |
| {
 | |
|   int i = -1;
 | |
|   #pragma omp master taskloop simd in_reduction (+:n) grainsize (64)
 | |
|   for (i = (x & 1) * (N / 2); i < (x & 1) * (N / 2) + (N / 2); i++)
 | |
|     n += 2 * u[i];
 | |
|   if (i != (omp_get_thread_num () ? -1 : (x & 1) * (N / 2) + (N / 2)))
 | |
|     abort ();
 | |
| }
 | |
| 
 | |
| __attribute__((noipa)) void
 | |
| baz (void)
 | |
| {
 | |
|   int i;
 | |
|   #pragma omp parallel master taskloop simd reduction (+:o) grainsize (64)
 | |
|   for (i = 0; i < N; ++i)
 | |
|     o += u[i];
 | |
|   if (i != N)
 | |
|     abort ();
 | |
| }
 | |
| 
 | |
| int
 | |
| main ()
 | |
| {
 | |
|   int i;
 | |
|   for (i = 0; i < N; ++i)
 | |
|     u[i] = i;
 | |
|   #pragma omp parallel
 | |
|   {
 | |
|     foo ();
 | |
|     #pragma omp taskgroup task_reduction (+:n)
 | |
|     {
 | |
|       bar (0);
 | |
|       bar (1);
 | |
|     }
 | |
|   }
 | |
|   baz ();
 | |
|   if (m != (long)(N - 1) * (N / 2) || n != (long)(N - 1) * N || o != m)
 | |
|     abort ();
 | |
|   return 0;
 | |
| }
 |