public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug target/104250] New: [i386] GCC may want to use 32-bit (I)DIV if it can for 64-bit operands
@ 2022-01-26 18:30 thiago at kde dot org
  2022-01-26 18:38 ` [Bug target/104250] " pinskia at gcc dot gnu.org
  2022-01-27  8:12 ` rguenth at gcc dot gnu.org
  0 siblings, 2 replies; 3+ messages in thread
From: thiago at kde dot org @ 2022-01-26 18:30 UTC (permalink / raw)
  To: gcc-bugs

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

            Bug ID: 104250
           Summary: [i386] GCC may want to use 32-bit (I)DIV if it can for
                    64-bit operands
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: thiago at kde dot org
  Target Milestone: ---

In
long long f1(long long n, long long d)
{
    return n / d;
}

GCC generates:

        movq    %rdi, %rax
        cqto
        idivq   %rsi
        ret

Which is fine, except that the 64-bit IDIV instruction is significantly slower
than the 32-bit (I)DIV. In recent CPUs (such as PMC, SNC, WLC, GLC), that's 18
vs 14 cycles, but it was much worse in older CPUs. There's still a significant
difference for Atom cores, such as used in Alder Lake-E.

Clang generates:
        movq    %rdi, %rax
        movq    %rdi, %rcx
        orq     %rsi, %rcx
        shrq    $32, %rcx
        je      .LBB0_1
        cqto
        idivq   %rsi
        retq
.LBB0_1:
        xorl    %edx, %edx
        divl    %esi
        retq

That is, it ORs the two operands and checks if any bit in the upper half is
set. If so, it performs the 64-bit division; otherwise, it performs the 32-bit
one.

References:
https://gcc.godbolt.org/z/385a3da8q
https://uops.info/html-instr/IDIV_R32.html
https://uops.info/html-instr/IDIV_R64.html

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

* [Bug target/104250] [i386] GCC may want to use 32-bit (I)DIV if it can for 64-bit operands
  2022-01-26 18:30 [Bug target/104250] New: [i386] GCC may want to use 32-bit (I)DIV if it can for 64-bit operands thiago at kde dot org
@ 2022-01-26 18:38 ` pinskia at gcc dot gnu.org
  2022-01-27  8:12 ` rguenth at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: pinskia at gcc dot gnu.org @ 2022-01-26 18:38 UTC (permalink / raw)
  To: gcc-bugs

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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization
           Severity|normal                      |enhancement

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

* [Bug target/104250] [i386] GCC may want to use 32-bit (I)DIV if it can for 64-bit operands
  2022-01-26 18:30 [Bug target/104250] New: [i386] GCC may want to use 32-bit (I)DIV if it can for 64-bit operands thiago at kde dot org
  2022-01-26 18:38 ` [Bug target/104250] " pinskia at gcc dot gnu.org
@ 2022-01-27  8:12 ` rguenth at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: rguenth at gcc dot gnu.org @ 2022-01-27  8:12 UTC (permalink / raw)
  To: gcc-bugs

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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Target|                            |x86_64-*-* i?86-*-*

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
I'll note the code is significantly larger and requires at least one extra
register.  It also has the chance of mispredicting the branch in which case
it will likely be slower.  But I guess it's something for value-profiling?

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

end of thread, other threads:[~2022-01-27  8:12 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-01-26 18:30 [Bug target/104250] New: [i386] GCC may want to use 32-bit (I)DIV if it can for 64-bit operands thiago at kde dot org
2022-01-26 18:38 ` [Bug target/104250] " pinskia at gcc dot gnu.org
2022-01-27  8:12 ` 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).