public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug middle-end/114660] New: Exponentiating by squaring not performed for x * y * y * y * y
@ 2024-04-09 15:45 antoshkka at gmail dot com
  2024-04-09 15:48 ` [Bug middle-end/114660] " antoshkka at gmail dot com
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: antoshkka at gmail dot com @ 2024-04-09 15:45 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114660

            Bug ID: 114660
           Summary: Exponentiating by squaring not performed for x * y * y
                    * y * y
           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: ---

For the following code:

int mul(int x, int y) {
    return x * y * y * y * y;
}


with -O2 GCC produces the frollowing assembly:

mul(int, int):
  mov eax, edi
  imul eax, esi
  imul eax, esi
  imul eax, esi
  imul eax, esi
  ret


However, a more optimal code could be generated with less multiplications:

mul(int, int):
        mov     eax, edi
        imul    esi, esi
        imul    eax, esi
        imul    eax, esi
        ret

Godbolt playground: https://godbolt.org/z/6dP11jPfx

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug middle-end/114660] Exponentiating by squaring not performed for x * y * y * y * y
  2024-04-09 15:45 [Bug middle-end/114660] New: Exponentiating by squaring not performed for x * y * y * y * y antoshkka at gmail dot com
@ 2024-04-09 15:48 ` antoshkka at gmail dot com
  2024-04-09 18:01 ` [Bug tree-optimization/114660] " pinskia at gcc dot gnu.org
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: antoshkka at gmail dot com @ 2024-04-09 15:48 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114660

--- Comment #1 from Antony Polukhin <antoshkka at gmail dot com> ---
The above godbolt link for an old version of GCC, here's for 14.0
https://godbolt.org/z/dTPYY1T9W

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug tree-optimization/114660] Exponentiating by squaring not performed for x * y * y * y * y
  2024-04-09 15:45 [Bug middle-end/114660] New: Exponentiating by squaring not performed for x * y * y * y * y antoshkka at gmail dot com
  2024-04-09 15:48 ` [Bug middle-end/114660] " antoshkka at gmail dot com
@ 2024-04-09 18:01 ` pinskia at gcc dot gnu.org
  2024-04-09 18:07 ` pinskia at gcc dot gnu.org
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-04-09 18:01 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114660

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Severity|normal                      |enhancement
          Component|middle-end                  |tree-optimization

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
We don't do as much reassociation as we should with signed integers due to
overflow. If you use -fwrapv, you get the reassociation; I am 99% sure there is
a dup for this bug too.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug tree-optimization/114660] Exponentiating by squaring not performed for x * y * y * y * y
  2024-04-09 15:45 [Bug middle-end/114660] New: Exponentiating by squaring not performed for x * y * y * y * y antoshkka at gmail dot com
  2024-04-09 15:48 ` [Bug middle-end/114660] " antoshkka at gmail dot com
  2024-04-09 18:01 ` [Bug tree-optimization/114660] " pinskia at gcc dot gnu.org
@ 2024-04-09 18:07 ` pinskia at gcc dot gnu.org
  2024-04-09 18:22 ` jakub at gcc dot gnu.org
  2024-04-10  6:28 ` rguenth at gcc dot gnu.org
  4 siblings, 0 replies; 6+ messages in thread
From: pinskia at gcc dot gnu.org @ 2024-04-09 18:07 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114660

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2024-04-09
     Ever confirmed|0                           |1

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #2)
> We don't do as much reassociation as we should with signed integers due to
> overflow. If you use -fwrapv, you get the reassociation; I am 99% sure there
> is a dup for this bug too.

I should say we also do it for unsigned already (see PR 95867), -fwrapv case we
just treat signed similar to unsigned here. Anyways what needs to happen is we
need 2 levels of gimple, one with signed integer overflow behavior and then one
with wrapping behavior. RTL does not distinguish between signed and unsigned
behaviors for many operations (plus and multiple) so we get some optimizations
there but not all.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug tree-optimization/114660] Exponentiating by squaring not performed for x * y * y * y * y
  2024-04-09 15:45 [Bug middle-end/114660] New: Exponentiating by squaring not performed for x * y * y * y * y antoshkka at gmail dot com
                   ` (2 preceding siblings ...)
  2024-04-09 18:07 ` pinskia at gcc dot gnu.org
@ 2024-04-09 18:22 ` jakub at gcc dot gnu.org
  2024-04-10  6:28 ` rguenth at gcc dot gnu.org
  4 siblings, 0 replies; 6+ messages in thread
From: jakub at gcc dot gnu.org @ 2024-04-09 18:22 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114660

--- Comment #4 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I think we've been discussing an idea of turning on flag_wrapv very late among
the GIMPLE passes and reassociate again.  Because RTL also kind of assumes
flag_wrapv, there is no difference between signed/unsigned
addition/subtraction/non-widening multiplication.
Though, a question is if it wouldn't screw up range info for use during
expansion too much.  Other option is to rewrite into unsigned operations only
what we've successfully reassociated in the late reassoc pass.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [Bug tree-optimization/114660] Exponentiating by squaring not performed for x * y * y * y * y
  2024-04-09 15:45 [Bug middle-end/114660] New: Exponentiating by squaring not performed for x * y * y * y * y antoshkka at gmail dot com
                   ` (3 preceding siblings ...)
  2024-04-09 18:22 ` jakub at gcc dot gnu.org
@ 2024-04-10  6:28 ` rguenth at gcc dot gnu.org
  4 siblings, 0 replies; 6+ messages in thread
From: rguenth at gcc dot gnu.org @ 2024-04-10  6:28 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114660

--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
For the case in question when x is zero then y can be INT_MAX and thus y * y
already overflow. But x * y * y * y * y * y could be associated as
(x * y) * (y^4).

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2024-04-10  6:28 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-09 15:45 [Bug middle-end/114660] New: Exponentiating by squaring not performed for x * y * y * y * y antoshkka at gmail dot com
2024-04-09 15:48 ` [Bug middle-end/114660] " antoshkka at gmail dot com
2024-04-09 18:01 ` [Bug tree-optimization/114660] " pinskia at gcc dot gnu.org
2024-04-09 18:07 ` pinskia at gcc dot gnu.org
2024-04-09 18:22 ` jakub at gcc dot gnu.org
2024-04-10  6:28 ` rguenth 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).