Re: 'Call clzl check' breaks cross compilation (was: PATCH 13/22] Coarray caf_shmem final patch set)

Richard Biener <[email protected]>
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.fortran
Message-ID <CAFiYyc08-5JWnJvMc=AtSGq8=jiCmftEDHRsbF8Xw3JQ9DdeMg@mail.gmail.com>
On Fri, Feb 27, 2026 at 1:01 PM Richard Biener
<[email protected]> wrote:
>
> On Fri, Feb 27, 2026 at 12:56 PM Tobias Burnus <[email protected]> wrote:
> >
> > Hi Jerry & Andre,
> >
> > the commit r16-7734-g136940891b16ba breaks cross compilation:
> >
> > Jerry D wrote:
> > > From: Andre Vehreschild<[email protected]>
> > > Date: Thu, 12 Feb 2026 11:17:47 -0800
> > > Subject: [PATCH] Fortran: Add a shared memory coarray implementation [PR88076]
> > >
> > > Add caf_shmem, a shared memory multi process coarray implementation.
> > > The library adheres to the existing coarray ABI and is controlled by
> > > environment variables for selecting the number of images and virtual
> > > memory size.
> > ...
> > > libgfortran/ChangeLog:
> > >
> > >       * Makefile.am: Add new library.
> > >       * Makefile.in: Regenerated
> > >       * acinclude.m4: Add check for reasonable clzl.
> > >       * config.h.in: Regenerate.
> > >       * configure: Regenerate.
> > >       * configure.ac: Call clzl check.
> > * * *
> > > --- a/libgfortran/acinclude.m4
> > > +++ b/libgfortran/acinclude.m4
> > ...
> > > +AC_DEFUN([LIBGFOR_CHECK_SANE_BUILTIN_CLZL], [
> > > +  AC_RUN_IFELSE([AC_LANG_PROGRAM([[
> > > +      int main()
> > > +      {
> > > +     return __builtin_clzl(256) != 8;
> > > +      }]], [[]])],
> > > +    AC_DEFINE(HAVE_SANE_BUILTIN_CLZL, 1,
> > > +      [Define if __builtin_clzl behaves as expected.])
> > > +    AM_CONDITIONAL([HAVE_SANE_BUILTIN_CLZL],true),
> > > +    [AM_CONDITIONAL([HAVE_SANE_BUILTIN_CLZL],false)])
> > > +])
>
> What does this test anyway?  clzl (256) should not return 8 but 55.
> Did  you want to check c_T_zl here?  I suggest to simply drop this given
> it's broken?

I'm also not convinced by

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

which uses VOIDP_BITS, not 'unsigned long' bits, and it seems to
correlate size_t width with unsigned long width by using INTPTR_WIDTH.
What do you do for long == 32bits targets (windows) which have 64bit
pointers?  You want to use __builtin_clzll there I think.

Of course the FP fallback

#else
  return 1 << (int)ceil(log2(size));
#endif

is also a bit questionable.  See gcc/hwint.{h,cc} for ceil_log2 on
uint64_t.

Richard.

>
> Richard.
>
> > This fails with:
> >
> > configure: error: in build-gcc-trunk-offload-amdgcn/amdgcn-amdhsa/libgfortran'
> > configure: error: cannot run test program while cross compiling
> >
> > Namely, the generated configure file contains:
> > > # Check if __builtin_clzl behaves (it doesn't on Msys2/ucrt64).
> > >
> > >    if test "$cross_compiling" = yes; then :
> > >    { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
> > > $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
> > > as_fn_error $? "cannot run test program while cross compiling
> > > See \`config.log' for more details" "$LINENO" 5; }
> > > else
> >
> > In the code, you can either use code like:
> >    if test "$cross_compiling" != no; then
> > for the current code and the following in an else branch.
> > Or just the following:
> >
> >    case "${host}" in
> >    *-*-mingw32*)
> >        ....
> >      ;;
> >    *)
> >      ....
> >      ;;
> >    esac
> >
> > In any case, AC_RUN_IFELSE is wrong for cross compilation,
> > AC_COMPILE_IFELSE is fine.
> >
> > Tobias
> >
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.