[Bug middle-end/91739] New: Missed optimization for arithmetic operations of integers and floating point constants
antoshkka at gmail dot com
gcc-bugzilla@gcc.gnu.org
Wed Sep 11 14:16:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91739
Bug ID: 91739
Summary: Missed optimization for arithmetic operations of
integers and floating point constants
Product: gcc
Version: 10.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 example:
double foo(unsigned i, unsigned j) {
return i * 4.0 + j * 7.0;
}
Right now GCC emits code that converts integers to a floating points and does
the multiplications:
foo(unsigned int, unsigned int): # @foo(unsigned int, unsigned int)
mov eax, edi
cvtsi2sd xmm1, rax
mulsd xmm1, qword ptr [rip + .LCPI0_0]
mov eax, esi
cvtsi2sd xmm0, rax
mulsd xmm0, qword ptr [rip + .LCPI0_1]
addsd xmm0, xmm1
ret
However it is possible to do better. If the max value of integer multiplied by
the floating point constant fits into the mantissa and there is an integral
type that could also hold the value then do the multiplication using integers:
double foo2(unsigned i, unsigned j) {
return i * 4ull + j * 7ull;
}
This results in a much better code:
foo2(unsigned int, unsigned int): # @foo2(unsigned int, unsigned int)
mov eax, edi
mov ecx, esi
lea rdx, [8*rcx]
sub rdx, rcx
lea rax, [rdx + 4*rax]
cvtsi2sd xmm0, rax
ret
More information about the Gcc-bugs
mailing list