https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82153
Bug ID: 82153 Summary: missed optimization: double rounding Product: gcc Version: 7.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: arjan at linux dot intel.com Target Milestone: --- #include <math.h> int roundme(double A) { return floor(A * 4.3); } leads to 0000000000000000 <roundme>: 0: f2 0f 59 05 00 00 00 mulsd 0x0(%rip),%xmm0 # 8 <roundme+0x8> 7: 00 8: 66 0f 3a 0b c0 09 roundsd $0x9,%xmm0,%xmm0 e: f2 0f 2c c0 cvttsd2si %xmm0,%eax 12: c3 retq both roundsd $0x9 and cvttsd2si truncate (floor) their argument, so gcc is doing redundant work here; roundsd is +/- 8 cycles which is not cheap.