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

            Bug ID: 82260
           Summary: [x86] Unnecessary use of 8-bit registers with -Os.
                    slightly slower and larger code
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: peter at cordes dot ca
  Target Milestone: ---
            Target: x86_64-*-*, i?86-*-*

int shift(int x, int c) {
        return x >> c;
}
// https://godbolt.org/g/waovLu

gcc8 20170915 -Os -mtune=haswell:
        movl    %edi, %eax
        movb    %sil, %cl       # bad
        sarl    %cl, %eax
        ret

-O3:
        movl    %edi, %eax
        movl    %esi, %ecx      # good
        sarl    %cl, %eax
        ret

The 8-bit MOV needs a REX prefix to access %sil, and has a false dependency on
the old value of RCX.  Haswell/Skylake don't rename low8 partial registers,
only high8.  https://stackoverflow.com/q/45660139/224132.  P6 and Sandybridge
do, but an 8-bit mov is definitely *not* better when a 32-bit mov is also an
option.

So -Os makes code that's larger and also potentially slower.

Reply via email to