Ref: https://gcc.gnu.org/pipermail/fortran/2026-February/063551.html
See attached.
Awaiting approval.
From 2a9f07181318677ee7a958bc9890b090c7528641 Mon Sep 17 00:00:00 2001
From: Andre Vehreschild <[email protected]>
Date: Mon, 1 Sep 2025 14:11:27 +0200
Subject: [PATCH] Fortran: Detect working CLZL or use alternative.
libgfortran/ChangeLog:
* caf/shmem/allocator.c (next_power_of_two): Use sane clzl
implementation or alternative.
---
libgfortran/caf/shmem/allocator.c | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/libgfortran/caf/shmem/allocator.c b/libgfortran/caf/shmem/allocator.c
index d900167cfc2..3ea4d50e045 100644
--- a/libgfortran/caf/shmem/allocator.c
+++ b/libgfortran/caf/shmem/allocator.c
@@ -25,6 +25,10 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
/* Main allocation routine, works like malloc. Round up allocations
to the next power of two and keep free lists in buckets. */
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
#include "libgfortran.h"
#include "allocator.h"
@@ -74,8 +78,16 @@ allocator_init_supervisor (allocator *a, allocator_shared *s, shared_memory sm)
static size_t
next_power_of_two (size_t size)
{
+#ifdef HAVE_SANE_BUILTIN_CLZL
assert (size);
+#if (__INTPTR_WIDTH__ == 64)
return 1 << (VOIDP_BITS - __builtin_clzl (size - 1));
+#else
+ return 1 << (VOIDP_BITS - __builtin_clz (size - 1));
+#endif
+#else
+ return 1 << (int)ceil(log2(size));
+#endif
}
shared_mem_ptr
--
2.53.0