[Bug middle-end/114270] New: Integer multiplication on floating point constant with conversion back to integer is not optimized
antoshkka at gmail dot com
gcc-bugzilla@gcc.gnu.org
Thu Mar 7 15:31:55 GMT 2024
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
More information about the Gcc-bugs
mailing list