| /* 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; |
| } |