summaryrefslogtreecommitdiffstats
path: root/libgomp
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2008-03-18 09:54:21 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2008-03-18 09:54:21 +0000
commit5205ccb0520a21ad8aae863b91e3d623621490c5 (patch)
treed01dbe463d0b40bd2cac5bd2b07a86da47384d6c /libgomp
parent8123bff6b151c39b5d55fb3ff7f37e68f7c68409 (diff)
downloadppe42-gcc-5205ccb0520a21ad8aae863b91e3d623621490c5.tar.gz
ppe42-gcc-5205ccb0520a21ad8aae863b91e3d623621490c5.zip
PR libgomp/35625
* iter.c (gomp_iter_guided_next_locked): If q > n, set end to ws->end. (gomp_iter_guided_next): Likewise. * testsuite/libgomp.c/pr35625.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@133306 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgomp')
-rw-r--r--libgomp/ChangeLog7
-rw-r--r--libgomp/iter.c22
-rw-r--r--libgomp/testsuite/libgomp.c/pr35625.c18
3 files changed, 36 insertions, 11 deletions
diff --git a/libgomp/ChangeLog b/libgomp/ChangeLog
index 5440f59f726..5c548844a7a 100644
--- a/libgomp/ChangeLog
+++ b/libgomp/ChangeLog
@@ -1,3 +1,10 @@
+2008-03-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR libgomp/35625
+ * iter.c (gomp_iter_guided_next_locked): If q > n, set end to ws->end.
+ (gomp_iter_guided_next): Likewise.
+ * testsuite/libgomp.c/pr35625.c: New test.
+
2008-03-16 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
* aclocal.m4: Regenerate.
diff --git a/libgomp/iter.c b/libgomp/iter.c
index 1a8a2a7d04f..2d5dd2edd5a 100644
--- a/libgomp/iter.c
+++ b/libgomp/iter.c
@@ -242,16 +242,16 @@ gomp_iter_guided_next_locked (long *pstart, long *pend)
if (ws->next == ws->end)
return false;
- n = (ws->end - ws->next) / ws->incr;
+ start = ws->next;
+ n = (ws->end - start) / ws->incr;
q = (n + nthreads - 1) / nthreads;
if (q < ws->chunk_size)
q = ws->chunk_size;
- if (q > n)
- q = n;
-
- start = ws->next;
- end = start + q * ws->incr;
+ if (q <= n)
+ end = start + q * ws->incr;
+ else
+ end = ws->end;
ws->next = end;
*pstart = start;
@@ -286,15 +286,15 @@ gomp_iter_guided_next (long *pstart, long *pend)
if (start == end)
return false;
- n = (end - start) / ws->incr;
+ n = (end - start) / incr;
q = (n + nthreads - 1) / nthreads;
if (q < chunk_size)
q = chunk_size;
- if (q > n)
- q = n;
-
- nend = start + q * incr;
+ if (__builtin_expect (q <= n, 1))
+ nend = start + q * incr;
+ else
+ nend = end;
tmp = __sync_val_compare_and_swap (&ws->next, start, nend);
if (__builtin_expect (tmp == start, 1))
diff --git a/libgomp/testsuite/libgomp.c/pr35625.c b/libgomp/testsuite/libgomp.c/pr35625.c
new file mode 100644
index 00000000000..f2978f91164
--- /dev/null
+++ b/libgomp/testsuite/libgomp.c/pr35625.c
@@ -0,0 +1,18 @@
+/* PR libgomp/35625 */
+/* { dg-do run } */
+/* { dg-options "-std=c99" } */
+
+int
+main (void)
+{
+#pragma omp parallel
+ {
+ #pragma omp for schedule (guided, 10)
+ for (int i = 0; i < 1826; i += 10)
+ ;
+ #pragma omp for schedule (guided, 10)
+ for (int i = 0; i > -1826; i -= 10)
+ ;
+ }
+ return 0;
+}
OpenPOWER on IntegriCloud