mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			74 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
| #include <omp.h>
 | |
| 
 | |
| __attribute__((noinline, noclone)) void
 | |
| foo (int &b)
 | |
| {
 | |
| #pragma omp parallel
 | |
| #pragma omp single
 | |
|   {
 | |
|     bool f = false;
 | |
|   #pragma omp taskloop firstprivate (b, f)
 | |
|     for (int i = 0; i < 30; i++)
 | |
|       {
 | |
| 	int q = omp_get_thread_num ();
 | |
| 	if (!f)
 | |
| 	  {
 | |
| 	    if (b != 2)
 | |
| 	      __builtin_abort ();
 | |
| 	  }
 | |
| 	else if (b != 8 * q)
 | |
| 	  __builtin_abort ();
 | |
| 	b = 8 * q;
 | |
| 	f = true;
 | |
|       }
 | |
|   }
 | |
|   int n;
 | |
| #pragma omp parallel
 | |
| #pragma omp single
 | |
|   {
 | |
|     bool f = false;
 | |
|   #pragma omp taskloop firstprivate (f) lastprivate (b, n)
 | |
|     for (int i = 0; i < 30; i++)
 | |
|       {
 | |
| 	int q = omp_get_thread_num ();
 | |
| 	if (f && b != 8 * q)
 | |
| 	  __builtin_abort ();
 | |
| 	b = 8 * q;
 | |
| 	n = q;
 | |
| 	f = true;
 | |
|       }
 | |
|   }
 | |
|   if (b != 8 * n)
 | |
|     __builtin_abort ();
 | |
|   b = 9;
 | |
| #pragma omp parallel
 | |
| #pragma omp single
 | |
|   {
 | |
|     bool f = false;
 | |
|   #pragma omp taskloop firstprivate (b, f) lastprivate (b, n)
 | |
|     for (int i = 0; i < 30; i++)
 | |
|       {
 | |
| 	int q = omp_get_thread_num ();
 | |
| 	if (!f)
 | |
| 	  {
 | |
| 	    if (b != 9)
 | |
| 	      __builtin_abort ();
 | |
| 	  }
 | |
| 	else if (b != 11 * q)
 | |
| 	  __builtin_abort ();
 | |
| 	b = 11 * q;
 | |
| 	n = q;
 | |
| 	f = true;
 | |
|       }
 | |
|   }
 | |
|   if (b != 11 * n)
 | |
|     __builtin_abort ();
 | |
| }
 | |
| 
 | |
| int
 | |
| main ()
 | |
| {
 | |
|   int b = 2;
 | |
|   foo (b);
 | |
| }
 |