re PR libgomp/43569 (libgomp: Conditional jump or move depends on uninitialised value)
authorJakub Jelinek <jakub@redhat.com>
Tue, 20 Apr 2010 15:36:45 +0000 (17:36 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 20 Apr 2010 15:36:45 +0000 (17:36 +0200)
PR libgomp/43569
* sections.c (gomp_sections_init): Initialize ws->mode.

From-SVN: r158564

libgomp/ChangeLog
libgomp/sections.c

index 5534cd6..7756ac1 100644 (file)
@@ -1,3 +1,8 @@
+2010-04-20  Jakub Jelinek  <jakub@redhat.com>
+
+       PR libgomp/43569
+       * sections.c (gomp_sections_init): Initialize ws->mode.
+
 2010-04-14  Uros Bizjak  <ubizjak@gmail.com>
 
        * acinclude.m4 (LIBGOMP_CHECK_SYNC_BUILTINS): Remove set but
index 7acd441..c7f49b7 100644 (file)
@@ -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