https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62098
Bug ID: 62098 Summary: incorrect code generated by arm gcc Product: gcc Version: 4.10.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target Assignee: unassigned at gcc dot gnu.org Reporter: carrot at google dot com Target: arm-unknown-linux-gnueabi Compile following source code with options -march=armv7-a -mfpu=vfpv3 -mfloat-abi=softfp -O2 -std=gnu++11 #include <limits> #include <cmath> const int kFixedPointDenominator = 64; float ceilToFloat(int m_value) { float floatValue = static_cast<float>(m_value) / kFixedPointDenominator; if (static_cast<int>(floatValue * kFixedPointDenominator) == m_value) return floatValue; if (floatValue > 0) return nextafterf(floatValue, std::numeric_limits<float>::max()); return nextafterf(floatValue, std::numeric_limits<float>::min()); } trunk gcc generates: fmsr s15, r0 @ int vcvt.f32.s32 s15, s15, #6 // A vcvt.s32.f32 s15, s15, #6 // B vmov r3, s15 cmp r3, r0 beq .L2 fcmpezs s15 fmstat ble .L6 movw r1, #65535 fmrs r0, s15 movt r1, 32639 b nextafterf .L6: mov r1, #8388608 fmrs r0, s15 b nextafterf .L2: fmrs r0, s15 // C bx lr Instruction C returns the result of instruction B, but the expected return value is the result of instruction A. 4.9 branch generates the same wrong codes, but 4.8 is correct.