https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93744
--- Comment #8 from Jakub Jelinek <jakub at gcc dot gnu.org> --- As for the signed zeros, I can't really reproduce it. Tried with: __attribute__((noipa)) void foo (int x) { double a = 0.0; double b = -0.0; _Bool c = x > 0; _Bool d = x > 1; double e = c; double f = d; double g = e * a; double h = f * b; if (__builtin_copysign (1.0, g) != 1.0 || __builtin_copysign (1.0, h) != -1.0) __builtin_abort (); } int main () { foo (0); return 0; } The thing is that convert in (convert (cmp $0 $1)) seems to match just CASE_CONVERT:, but result of a comparison is always integral (or vector integral) and so there would need to be a FLOAT_EXPR rather than {NOP,CONVERT}_EXPR to convert it to floating point. Allowing other comparisons or any boolean results is certainly reasonable, but would be an enhancement request for GCC 11.