https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91645
--- Comment #11 from Jakub Jelinek <jakub at gcc dot gnu.org> --- (In reply to Aldy Hernandez from comment #9) > It looks like what we want for this test is actually !isgreaterequal() not > isless(), since we want to exclude the possibility of a NAN. Like this: > > float test (float x) > { > if (!__builtin_isgreaterequal (x, 0.0)) > __builtin_unreachable(); > return sqrtf (x); > } No, what we emit for sqrtf is effectively: if (!__builtin_isless (x, 0.0)) asm ("sqrtss %0, %0" : "+x" (x)); else x = sqrtf (x); // The library version return x; So, the if (__builtin_isless (x, 0.0) __builtin_unreachable (); is all we need. We should either ask in tree-call-cdce.cc before trying to create this whether x range is [-0.0, +Inf] NAN or some subset thereof, in that case just use the .SQRT internal call, or if it is [-Inf, nextafterf (-0.0, -Inf)] or subset thereof, then use the library call only. Or try to fold it in vrp2 or when, but in that case we don't know that easily whether the comparison can be optimized away completely (it still raises exceptions on sNaN).