https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102018
--- Comment #6 from Christophe Lyon <clyon at gcc dot gnu.org> --- Looking at dumps when compiling for cortex-m7 and cortex-m55, I noticed a difference in the first gimple trace (pr82692.c.007t.gimple). For m7, we have: _1 = x u> 0.0; _2 = ~_1; _3 = x u<= 1.0e+0; _4 = ~_3; _5 = _2 | _4; if (_5 != 0) goto <D.6236>; else goto <D.6237>; <D.6236>: D.6238 = x * 2.0e+0; return D.6238; <D.6237>: D.6238 = x * x; return D.6238; For m55, we have: _1 = x u> 0.0; _2 = ~_1; if (_2 != 0) goto <D.6614>; else goto <D.6616>; <D.6616>: _3 = x u<= 1.0e+0; _4 = ~_3; if (_4 != 0) goto <D.6614>; else goto <D.6615>; <D.6614>: D.6617 = x * 2.0e+0; return D.6617; <D.6615>: D.6617 = x * x; return D.6617; So for m55 (where the test passes), we have two FP comparisons, whereas for m7 we have only one comparison, on a boolean (_5 != 0), I suspect that's why we later have a CCFP vs CCFPE.