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).