mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			124 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			124 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C
		
	
	
	
| /* PR middle-end/33880 */
 | |
| /* { dg-do run } */
 | |
| 
 | |
| extern void abort (void);
 | |
| 
 | |
| void
 | |
| test1 (void)
 | |
| {
 | |
|   int i = 0, j = 0;
 | |
|   void bar (void)
 | |
|   {
 | |
|     i++;
 | |
|     j++;
 | |
|   }
 | |
|   bar ();
 | |
|   #pragma omp parallel for num_threads(4)
 | |
|     for (i = 0; i < 100; i++)
 | |
|       #pragma omp atomic
 | |
| 	j += 1;
 | |
|   if (j != 101)
 | |
|     abort ();
 | |
|   #pragma omp parallel for lastprivate(i) num_threads(2)
 | |
|     for (i = 0; i < 100; i++)
 | |
|       #pragma omp atomic
 | |
| 	j += 1;
 | |
|   if (i != 100)
 | |
|     abort ();
 | |
|   i = 3;
 | |
|   bar ();
 | |
|   if (j != 202)
 | |
|     abort ();
 | |
|   if (i != 4)
 | |
|     abort ();
 | |
| }
 | |
| 
 | |
| void
 | |
| test2 (void)
 | |
| {
 | |
|   int i = -1, j = 99, k, l = 9, m = 0;
 | |
|   void bar (void)
 | |
|   {
 | |
|     i++;
 | |
|     j++;
 | |
|     l++;
 | |
|     m++;
 | |
|   }
 | |
|   bar ();
 | |
|   #pragma omp parallel for num_threads(4)
 | |
|     for (k = i; k < j; k += l)
 | |
|       #pragma omp atomic
 | |
| 	m += 1;
 | |
|   bar ();
 | |
|   if (i != 1 || j != 101 || l != 11 || m != 12)
 | |
|     abort ();
 | |
| }
 | |
| 
 | |
| void
 | |
| test3 (void)
 | |
| {
 | |
|   int i, j, k, l, m;
 | |
|   void bar (void)
 | |
|   {
 | |
|   #pragma omp parallel for num_threads(4)
 | |
|     for (i = j; i < k; i += l)
 | |
|       #pragma omp atomic
 | |
|         m += 1;
 | |
|   }
 | |
|   void baz (void)
 | |
|   {
 | |
|   #pragma omp parallel for num_threads(2) lastprivate(i)
 | |
|     for (i = j; i < k * 2; i += l / 2)
 | |
|       #pragma omp atomic
 | |
|         m += 1;
 | |
|   }
 | |
|   i = 7;
 | |
|   j = 0;
 | |
|   k = 100;
 | |
|   l = 2;
 | |
|   m = 0;
 | |
|   bar ();
 | |
|   if (j != 0 || k != 100 || l != 2 || m != 50)
 | |
|     abort ();
 | |
|   baz ();
 | |
|   if (i != 200 || j != 0 || k != 100 || l != 2 || m != 250)
 | |
|     abort ();
 | |
| }
 | |
| 
 | |
| void
 | |
| test4 (void)
 | |
| {
 | |
|   int i, j, k, l, m = 0;
 | |
|   int foo (void)
 | |
|   {
 | |
|     return j;
 | |
|   }
 | |
|   int bar (void)
 | |
|   {
 | |
|     return k;
 | |
|   }
 | |
|   int baz (void)
 | |
|   {
 | |
|     return l;
 | |
|   }
 | |
|   j = 0;
 | |
|   k = 1000;
 | |
|   l = 2;
 | |
|   #pragma omp parallel for num_threads(8) lastprivate(i)
 | |
|   for (i = foo (); i < bar (); i += baz ())
 | |
|     #pragma omp atomic
 | |
|       m += 1;
 | |
|   if (i != 1000 || m != 500 || j != 0 || k != 1000 || l != 2)
 | |
|     abort ();
 | |
| }
 | |
| 
 | |
| int
 | |
| main (void)
 | |
| {
 | |
|   test1 ();
 | |
|   test2 ();
 | |
|   test3 ();
 | |
|   test4 ();
 | |
|   return 0;
 | |
| }
 |