mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			113 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			C
		
	
	
	
| extern void abort (void);
 | |
| 
 | |
| int
 | |
| main ()
 | |
| {
 | |
|   int a = 1, b = 2, c = 4, d[7];
 | |
|   #pragma omp parallel
 | |
|   {
 | |
|     #pragma omp single
 | |
|     {
 | |
|       #pragma omp taskgroup
 | |
|       {
 | |
| 	#pragma omp target enter data nowait map (to: a, b, c) depend(out: d[0])
 | |
| 	#pragma omp target nowait map (alloc: a, b) depend(in: d[0]) depend(out: d[1])
 | |
| 	{
 | |
| 	  #pragma omp atomic update
 | |
| 	  a |= 4;
 | |
| 	  #pragma omp atomic update
 | |
| 	  b |= 8;
 | |
| 	}
 | |
| 	#pragma omp target nowait map (alloc: a, c) depend(in: d[0]) depend(out: d[2])
 | |
| 	{
 | |
| 	  #pragma omp atomic update
 | |
| 	  a |= 16;
 | |
| 	  #pragma omp atomic update
 | |
| 	  c |= 32;
 | |
| 	}
 | |
| 	#pragma omp target exit data nowait map (from: a, b, c) depend(in: d[1], d[2])
 | |
|       }
 | |
|       if (a != 21 || b != 10 || c != 36)
 | |
| 	abort ();
 | |
|       #pragma omp target map (tofrom: a, b) nowait
 | |
|       {
 | |
| 	a &= ~16;
 | |
| 	b &= ~2;
 | |
|       }
 | |
|       #pragma omp target map (tofrom: c) nowait
 | |
|       {
 | |
| 	c |= 8;
 | |
|       }
 | |
|     } /* Implicit barrier here.  */
 | |
|     #pragma omp single
 | |
|     {
 | |
|       if (a != 5 || b != 8 || c != 44)
 | |
| 	abort ();
 | |
|       #pragma omp target map (tofrom: a, b) nowait
 | |
|       {
 | |
| 	a |= 32;
 | |
| 	b |= 4;
 | |
|       }
 | |
|       #pragma omp target map (tofrom: c) nowait
 | |
|       c &= ~4;
 | |
|       #pragma omp taskwait
 | |
|       if (a != 37 || b != 12 || c != 40)
 | |
| 	abort ();
 | |
|       #pragma omp target nowait map (tofrom: a, b) depend(out: d[3])
 | |
|       {
 | |
| 	#pragma omp atomic update
 | |
| 	a = a + 9;
 | |
| 	b -= 8;
 | |
|       }
 | |
|       #pragma omp target nowait map (tofrom: a, c) depend(out: d[4])
 | |
|       {
 | |
| 	#pragma omp atomic update
 | |
| 	a = a + 4;
 | |
| 	c >>= 1;
 | |
|       }
 | |
|       #pragma omp task if (0) depend (in: d[3], d[4]) shared (a, b, c)
 | |
|       if (a != 50 || b != 4 || c != 20)
 | |
| 	abort ();
 | |
|       #pragma omp task shared (a)
 | |
|       a += 50;
 | |
|       #pragma omp target nowait map (tofrom: b)
 | |
|       b++;
 | |
|       #pragma omp target map (tofrom: c) nowait
 | |
|       c--;
 | |
|       #pragma omp taskwait
 | |
|       if (a != 100 || b != 5 || c != 19)
 | |
| 	abort ();
 | |
|       #pragma omp target map (tofrom: a) nowait depend(out: d[5])
 | |
|       a++;
 | |
|       #pragma omp target map (tofrom: b) nowait depend(out: d[6])
 | |
|       b++;
 | |
|       #pragma omp target map (tofrom: a, b) depend(in: d[5], d[6])
 | |
|       {
 | |
| 	if (a != 101 || b != 6)
 | |
| 	  a = -9;
 | |
| 	else
 | |
| 	  {
 | |
| 	    a = 24;
 | |
| 	    b = 38;
 | |
| 	  }
 | |
|       }
 | |
|       if (a != 24 || b != 38)
 | |
| 	abort ();
 | |
|     } /* Implicit barrier here.  */
 | |
|     #pragma omp master
 | |
|     {
 | |
|       #pragma omp target nowait map (tofrom: a, b)
 | |
|       {
 | |
| 	a *= 2;
 | |
| 	b++;
 | |
|       }
 | |
|       #pragma omp target map (tofrom: c) nowait
 | |
|       c--;
 | |
|     }
 | |
|     #pragma omp barrier
 | |
|     if (a != 48 || b != 39 || c != 18)
 | |
|       abort ();
 | |
|   }
 | |
|   return 0;
 | |
| }
 |