|
From: | Paul Eggert |
Subject: | bug#69770: [PATCH] build: strengthen 16 bit float support checks |
Date: | Thu, 14 Mar 2024 22:21:11 -0700 |
User-agent: | Mozilla Thunderbird |
On 2024-03-14 06:03, Pádraig Brady wrote:
How about leaving it AC_COMPILE_IFELSE, but ensuring that -O1 or better is used when the compiler supports -O1? That way we don't have to worry about running the program, because (with the "volatile") clang will error out. Alternatively perhaps there's some way to check for the bug using preprocessor macros like __FLT16_MANT_DIG__, __FLT16_MAX_EXP__, __clang_major__, and __aarch64__. (This could be more fragile, though, as clang presumably will fix the bug eventually.)That would probably work for this edge case, but it's brittle and I'm worried about other combinations of compiler versions, complier options, and architectures.
Sure, but one cannot resolve such worries completely, as compiler errors are inherently brittle: even a runtime test cannot prove their absence.
As I understand it, __bf16 is a real zoo: sometimes hardware supports it, sometimes it doesn't, sometimes the software emulation library is there, sometimes it's not, and so forth. Running a program on a development host is likely to not match the runtime behavior on a production host, so AC_RUN_IFELSE is reasonably likely to produce a false positive, which is worse than a false negative.
Another issue, which is somewhat related, is that coreutils's current macro BF16_SUPPORTED is too broad. Because __bf16 has so many bugs, currently it's probably a mistake to say __bf16 is fully supported anywhere. Even GCC is buggy; see for example:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114347which I just now discovered when writing this email. The question isn't so much whether __bf16 is supported, it's whether it's supported well enough to compile and run GNU od.
Come to think of it, for 'od' we might be better off avoiding __bf16 entirely, and simply converting the bits by hand into a 'float' variable. This would likely be more portable, as it would work even with compilers that lack __bf16, or that have __bf16 bugs relevant to 'od'. And that way we could remove the configure-time test entirely. (There would be endianness issues but they're easily addressible.)
[Prev in Thread] | Current Thread | [Next in Thread] |