Index: gcc/libgomp/sections.c |
diff --git a/gcc/libgomp/sections.c b/gcc/libgomp/sections.c |
index 7acd441de53e908371e8647cc2c005b6c5a114d9..c7f49b7c32ad23836a77414a52caef87ec377a11 100644 |
--- a/gcc/libgomp/sections.c |
+++ b/gcc/libgomp/sections.c |
@@ -1,4 +1,4 @@ |
-/* Copyright (C) 2005, 2007, 2008, 2009 Free Software Foundation, Inc. |
+/* Copyright (C) 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
Contributed by Richard Henderson <rth@redhat.com>. |
This file is part of the GNU OpenMP Library (libgomp). |
@@ -34,9 +34,25 @@ gomp_sections_init (struct gomp_work_share *ws, unsigned count) |
{ |
ws->sched = GFS_DYNAMIC; |
ws->chunk_size = 1; |
- ws->end = count + 1; |
+ ws->end = count + 1L; |
ws->incr = 1; |
ws->next = 1; |
+#ifdef HAVE_SYNC_BUILTINS |
+ /* Prepare things to make each iteration faster. */ |
+ if (sizeof (long) > sizeof (unsigned)) |
+ ws->mode = 1; |
+ else |
+ { |
+ struct gomp_thread *thr = gomp_thread (); |
+ struct gomp_team *team = thr->ts.team; |
+ long nthreads = team ? team->nthreads : 1; |
+ |
+ ws->mode = ((nthreads | ws->end) |
+ < 1UL << (sizeof (long) * __CHAR_BIT__ / 2 - 1)); |
+ } |
+#else |
+ ws->mode = 0; |
+#endif |
} |
/* This routine is called when first encountering a sections construct |