From: Jakub Jelinek Date: Fri, 26 Oct 2018 16:50:59 +0000 (+0200) Subject: libgomp.h (GOMP_HAVE_EFFICIENT_ALIGNED_ALLOC): Define unless gomp_aligned_alloc uses... X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5fab271291a0deba6f098116748b4fe1a3c2788f;p=thirdparty%2Fgcc.git libgomp.h (GOMP_HAVE_EFFICIENT_ALIGNED_ALLOC): Define unless gomp_aligned_alloc uses fallback implementation. * 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 --- diff --git a/libgomp/ChangeLog.gomp b/libgomp/ChangeLog.gomp index 347c3efbeafa..cddc1365d05d 100644 --- a/libgomp/ChangeLog.gomp +++ b/libgomp/ChangeLog.gomp @@ -1,3 +1,13 @@ +2018-10-26 Jakub Jelinek + + * 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 * omp.h.in (enum omp_sched_t): Add omp_sched_monotonic. diff --git a/libgomp/alloc.c b/libgomp/alloc.c index 90d2d9cc4ef2..296f1af1eaa3 100644 --- a/libgomp/alloc.c +++ b/libgomp/alloc.c @@ -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 } diff --git a/libgomp/libgomp.h b/libgomp/libgomp.h index aed5e51aff1a..9728c8e5f687 100644 --- a/libgomp/libgomp.h +++ b/libgomp/libgomp.h @@ -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); diff --git a/libgomp/work.c b/libgomp/work.c index b2b341452892..ac2f0233120f 100644 --- a/libgomp/work.c +++ b/libgomp/work.c @@ -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];