https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114270
Bug ID: 114270 Summary: Integer multiplication on floating point constant with conversion back to integer is not optimized Product: gcc Version: 14.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: antoshkka at gmail dot com Target Milestone: --- Consider the following example: unsigned test(unsigned x) { return (unsigned)(x * 0.5); } With -O2 GCC generates the code with a fair conversion to fp and multiplication: test(unsigned int): mov edi, edi pxor xmm0, xmm0 cvtsi2sd xmm0, rdi mulsd xmm0, QWORD PTR .LC0[rip] cvttsd2si rax, xmm0 ret However the multiplication does not overflow and the floating point constant is a normal number. A more optimal code should look like the following: test(unsigned int): mov eax, edi shr eax ret Probably the optimization could be used for * any multiplication of integer on positive fp-number less or equal to 1.0 * any division of integer on positive fp-number greater or equal to 1.0 if the result is converted back to integer