mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			72 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
| #include <stdlib.h>
 | |
| #include <unistd.h>
 | |
| 
 | |
| void
 | |
| foo (int do_sleep)
 | |
| {
 | |
|   int a[64], i, *p = a + 4, x = 0;
 | |
|   asm volatile ("" : "+r" (p));
 | |
|   for (i = 0; i < 64; i++)
 | |
|     a[i] = i + 8;
 | |
|   #pragma omp parallel private (i)
 | |
|   {
 | |
|     #pragma omp single nowait
 | |
|     {
 | |
|       for (i = 0; i < 8; i++)
 | |
| 	{
 | |
| 	  #pragma omp task depend(out: a[i * 8 : 4])
 | |
| 	    a[i * 8] += (i + 2) * 9;
 | |
| 	  #pragma omp task depend(out: p[i * 8 : 2])
 | |
| 	    p[i * 8] += (i + 3) * 10;
 | |
| 	  #pragma omp task depend(out: x)
 | |
| 	    x = 1;
 | |
| 	}
 | |
|       for (i = 0; i < 8; i++)
 | |
| 	#pragma omp task depend(in: a[i * 8 : 4]) \
 | |
| 			 depend(inout: a[i * 8 + 4 : 2]) \
 | |
| 			 depend(in: a[0 : 4]) depend(in: x)
 | |
| 	{
 | |
| 	  if (a[0] != 8 + 2 * 9 || x != 1)
 | |
| 	    abort ();
 | |
| 	  if (a[i * 8] != i * 8 + 8 + (i + 2) * 9)
 | |
| 	    abort ();
 | |
| 	  if (a[4 + i * 8] != 4 + i * 8 + 8 + (i + 3) * 10)
 | |
| 	    abort ();
 | |
| 	  p[i * 8] += a[i * 8];
 | |
| 	}
 | |
|       for (i = 0; i < 8; i++)
 | |
| 	#pragma omp task depend(inout: a[i * 8 : 4]) \
 | |
| 			 depend(in: p[i * 8 : 2]) \
 | |
| 			 depend(in: p[0 : 2], x)
 | |
| 	{
 | |
| 	  if (p[0] != 4 + 8 + 3 * 10 + 0 + 8 + 2 * 9 || x != 1)
 | |
| 	    abort ();
 | |
| 	  if (a[i * 8] != i * 8 + 8 + (i + 2) * 9)
 | |
| 	    abort ();
 | |
| 	  if (a[4 + i * 8] != (4 + i * 8 + 8 + (i + 3) * 10
 | |
| 			       + i * 8 + 8 + (i + 2) * 9))
 | |
| 	    abort ();
 | |
| 	  a[i * 8] += 2;
 | |
| 	}
 | |
|       for (i = 0; i < 4; i++)
 | |
| 	#pragma omp task depend(in: a[i * 16 : 4], a[i * 16 + 8 : 4], x)
 | |
| 	{
 | |
| 	  if (a[i * 16] != i * 16 + 8 + (2 * i + 2) * 9 + 2 || x != 1)
 | |
| 	    abort ();
 | |
| 	  if (p[i * 16 + 4] != i * 16 + 8 + 8 + (2 * i + 1 + 2) * 9 + 2)
 | |
| 	    abort ();
 | |
| 	}
 | |
|     }
 | |
|     if (do_sleep)
 | |
|       sleep (1);
 | |
|   }
 | |
| }
 | |
| 
 | |
| int
 | |
| main ()
 | |
| {
 | |
|   foo (1);
 | |
|   foo (0);
 | |
|   return 0;
 | |
| }
 |