public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug middle-end/114270] New: Integer multiplication on floating point constant with conversion back to integer is not optimized
@ 2024-03-07 15:31 antoshkka at gmail dot com
2024-03-07 15:50 ` [Bug middle-end/114270] " pinskia at gcc dot gnu.org
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: antoshkka at gmail dot com @ 2024-03-07 15:31 UTC (permalink / raw)
To: gcc-bugs
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
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug middle-end/114270] Integer multiplication on floating point constant with conversion back to integer is not optimized
2024-03-07 15:31 [Bug middle-end/114270] New: Integer multiplication on floating point constant with conversion back to integer is not optimized antoshkka at gmail dot com
@ 2024-03-07 15:50 ` pinskia at gcc dot gnu.org
2024-03-08 8:28 ` rguenth at gcc dot gnu.org
2024-03-08 9:10 ` jakub at gcc dot gnu.org
2 siblings, 0 replies; 4+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-03-07 15:50 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114270
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Severity|normal |enhancement
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
The rules for this to be done are a bit more complex than what is described
here.
1) Significand precision of the floating point type needs to be >= precision of
the integer type
2) the 1/(multiplier) needs to be representable in the integer type
3) (I think this is required) no trapping math is enabled as inexact floating
point exception could happen
4) (maybe?) Significand only has the implicit 1 set.
Note there might be more rules on needed for this to be done and I have not
thought about all of them currently.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug middle-end/114270] Integer multiplication on floating point constant with conversion back to integer is not optimized
2024-03-07 15:31 [Bug middle-end/114270] New: Integer multiplication on floating point constant with conversion back to integer is not optimized antoshkka at gmail dot com
2024-03-07 15:50 ` [Bug middle-end/114270] " pinskia at gcc dot gnu.org
@ 2024-03-08 8:28 ` rguenth at gcc dot gnu.org
2024-03-08 9:10 ` jakub at gcc dot gnu.org
2 siblings, 0 replies; 4+ messages in thread
From: rguenth at gcc dot gnu.org @ 2024-03-08 8:28 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114270
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2024-03-08
Ever confirmed|0 |1
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
I think it makes sense to optimize for 1/power-of-two only. Whether
an actual integer division instruction we could replace x * FP_CST with
would be faster than int->FP, FP multiply, FP->int is questionable.
But a shift very likely is.
Special-casing just * 0.5 might also an option.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug middle-end/114270] Integer multiplication on floating point constant with conversion back to integer is not optimized
2024-03-07 15:31 [Bug middle-end/114270] New: Integer multiplication on floating point constant with conversion back to integer is not optimized antoshkka at gmail dot com
2024-03-07 15:50 ` [Bug middle-end/114270] " pinskia at gcc dot gnu.org
2024-03-08 8:28 ` rguenth at gcc dot gnu.org
@ 2024-03-08 9:10 ` jakub at gcc dot gnu.org
2 siblings, 0 replies; 4+ messages in thread
From: jakub at gcc dot gnu.org @ 2024-03-08 9:10 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114270
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |jakub at gcc dot gnu.org
--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #1)
> The rules for this to be done are a bit more complex than what is described
> here.
>
> 1) Significand precision of the floating point type needs to be >= precision
> of the integer type
I'd also verify that minimum/maximum of the integer type are exactly
representable in the floating point type, such that even limitations on
exponent don't stand in a way.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2024-03-08 9:10 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-03-07 15:31 [Bug middle-end/114270] New: Integer multiplication on floating point constant with conversion back to integer is not optimized antoshkka at gmail dot com
2024-03-07 15:50 ` [Bug middle-end/114270] " pinskia at gcc dot gnu.org
2024-03-08 8:28 ` rguenth at gcc dot gnu.org
2024-03-08 9:10 ` jakub at gcc dot gnu.org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).