https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105480
--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Kewen Lin from comment #6) > It's certainly an issue reported here, for one complete fix I did some more > investigation how the option -ftrapping-math affects things, from what LLVM > generates, it looks to me that: > 1) with -ftrapping-math, we can assume fp operations can raise exceptions > (user visible as doc said), here __builtin_isnan should not raise exception > even for sNaN, so it uses vector int instructions instead. > 2) while with -fno-trapping-math, we can assume fp operations can't raise > exceptions, and as doc said "This option requires that -fno-signaling-nans > be in effect", so there is no sNaN at all, safe to use vector fp > instructions which don't trap for qNaN. > > It's concluded that __builtin_isnan is supposed not to trap even if the > given value is sNaN. > > But with one simple scalar version of case with __builtin_isnan, I don't see > GCC honor -ftrapping-math from the code generated on both Power and aarch64: > > ---- > #define _GNU_SOURCE > #include "math.h" > > int func(double x) > { > return __builtin_isnan (x); > } > ---- > > w/ -ftrapping-math or -fno-trapping-math, it gets the same insns like: > > aarch64: > fcmp d0, d0 > cset w0, vs > ret > > ppc64le: > fcmpu 0,1,1 > mfcr 3,128 > rlwinm 3,3,4,1 > > Both fcmpu and fcmp would trap for sNaN, is it expected with the current GCC > implementation? But the key is -fsignalling-nans (default off) > Tested with compiler explorer, I saw LLVM generates insns without fcmpu on > Power, like: > > mffprd 4, 1 > li 3, 2047 > rldic 3, 3, 52, 1 > clrldi 4, 4, 1 > subc 4, 3, 4 > subfe 3, 3, 3 > neg 3, 3 > blr > > though I did still see LLVM uses fcmp on aarch64 (maybe a warning saying > "overriding currently unsupported use of floating point exceptions on this > target" can explain it). > > Another question in mind is that I saw GCC lowed __builtin_isnan with tree > code UNORDERED_EXPR, does it mean that UNORDERED_EXPR has the same semantic > as what's concluded for __builtin_isnan above (that is not to trap for both > qNaN and sNaN)? It seems internal documentation doesn't say much on this.