]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libgomp.h (GOMP_HAVE_EFFICIENT_ALIGNED_ALLOC): Define unless gomp_aligned_alloc uses...
authorJakub Jelinek <jakub@redhat.com>
Fri, 26 Oct 2018 16:50:59 +0000 (18:50 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 26 Oct 2018 16:50:59 +0000 (18:50 +0200)
* libgomp.h (GOMP_HAVE_EFFICIENT_ALIGNED_ALLOC): Define unless
gomp_aligned_alloc uses fallback implementation.
* alloc.c (NEED_SPECIAL_GOMP_ALIGNED_FREE): Don't define.
(gomp_aligned_free): Use !defined(GOMP_HAVE_EFFICIENT_ALIGNED_ALLOC)
instead of defined(NEED_SPECIAL_GOMP_ALIGNED_FREE).
* work.c (alloc_work_share): Use gomp_aligned_alloc instead of
gomp_malloc if GOMP_HAVE_EFFICIENT_ALIGNED_ALLOC is defined.

From-SVN: r265532

libgomp/ChangeLog.gomp
libgomp/alloc.c
libgomp/libgomp.h
libgomp/work.c

index 347c3efbeafa5bfa346d4b7678a2f2e4e525d0ad..cddc1365d05d7635ce0069fff9b0075f35285e57 100644 (file)
@@ -1,3 +1,13 @@
+2018-10-26  Jakub Jelinek  <jakub@redhat.com>
+
+       * libgomp.h (GOMP_HAVE_EFFICIENT_ALIGNED_ALLOC): Define unless
+       gomp_aligned_alloc uses fallback implementation.
+       * alloc.c (NEED_SPECIAL_GOMP_ALIGNED_FREE): Don't define.
+       (gomp_aligned_free): Use !defined(GOMP_HAVE_EFFICIENT_ALIGNED_ALLOC)
+       instead of defined(NEED_SPECIAL_GOMP_ALIGNED_FREE).
+       * work.c (alloc_work_share): Use gomp_aligned_alloc instead of
+       gomp_malloc if GOMP_HAVE_EFFICIENT_ALIGNED_ALLOC is defined.
+
 2018-10-25  Jakub Jelinek  <jakub@redhat.com>
 
        * omp.h.in (enum omp_sched_t): Add omp_sched_monotonic.
index 90d2d9cc4ef2e605b0046188f8fc2f5814b8b9ef..296f1af1eaa3ce4cbb3be386dbd36e9c65155d17 100644 (file)
@@ -87,7 +87,6 @@ gomp_aligned_alloc (size_t al, size_t size)
          ((void **) ap)[-1] = p;
          ret = ap;
        }
-#define NEED_SPECIAL_GOMP_ALIGNED_FREE
     }
 #endif
   if (ret == NULL)
@@ -98,10 +97,10 @@ gomp_aligned_alloc (size_t al, size_t size)
 void
 gomp_aligned_free (void *ptr)
 {
-#ifdef NEED_SPECIAL_GOMP_ALIGNED_FREE
+#ifdef GOMP_HAVE_EFFICIENT_ALIGNED_ALLOC
+  free (ptr);
+#else
   if (ptr)
     free (((void **) ptr)[-1]);
-#else
-  free (ptr);
 #endif
 }
index aed5e51aff1aa125a372f7461d9b2d123a3ae4c7..9728c8e5f6876f8e6e9d4d74213ba5e826ca90f7 100644 (file)
@@ -86,6 +86,15 @@ enum memmodel
 
 /* alloc.c */
 
+#if defined(HAVE_ALIGNED_ALLOC) \
+    || defined(HAVE__ALIGNED_MALLOC) \
+    || defined(HAVE_POSIX_MEMALIGN) \
+    || defined(HAVE_MEMALIGN)
+/* Defined if gomp_aligned_alloc doesn't use fallback version
+   and free can be used instead of gomp_aligned_free.  */
+#define GOMP_HAVE_EFFICIENT_ALIGNED_ALLOC 1
+#endif
+
 extern void *gomp_malloc (size_t) __attribute__((malloc));
 extern void *gomp_malloc_cleared (size_t) __attribute__((malloc));
 extern void *gomp_realloc (void *, size_t);
index b2b341452892d093e4fe3a9cb957d06b802d82e5..ac2f0233120f0ee32b08c01a961141f7bb52dcdb 100644 (file)
@@ -76,7 +76,15 @@ alloc_work_share (struct gomp_team *team)
 #endif
 
   team->work_share_chunk *= 2;
+  /* Allocating gomp_work_share structures aligned is just an
+     optimization, don't do it when using the fallback method.  */
+#ifdef GOMP_HAVE_EFFICIENT_ALIGNED_ALLOC
+  ws = gomp_aligned_alloc (__alignof (struct gomp_work_share),
+                          team->work_share_chunk
+                          * sizeof (struct gomp_work_share));
+#else
   ws = gomp_malloc (team->work_share_chunk * sizeof (struct gomp_work_share));
+#endif
   ws->next_alloc = team->work_shares[0].next_alloc;
   team->work_shares[0].next_alloc = ws;
   team->work_share_list_alloc = &ws[1];