[Bug rtl-optimization/94850] New: Failure to optimize operation corresponding to shrd to shrd

gabravier at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed Apr 29 14:33:28 GMT 2020


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

            Bug ID: 94850
           Summary: Failure to optimize operation corresponding to shrd to
                    shrd
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: gabravier at gmail dot com
  Target Milestone: ---

struct testStruct {
        uint64_t a;
        uint64_t b;
};

uint64_t f(testStruct t, int x)
{
        return ((t.a << (64 - x)) | (t.b >> (x)));
}

LLVM produces this : 

f(testStruct, int): # @f(testStruct, int)
  mov ecx, edx
  mov rax, rsi
  shrd rax, rdi, cl
  ret

GCC produces this :

f(testStruct, int):
  mov ecx, 64
  mov rax, rsi
  sub ecx, edx
  sal rdi, cl
  mov ecx, edx
  shr rax, cl
  or rax, rdi
  ret

A similar optimization can be done for shld for this code : 

uint64_t f(uint64_t a, uint64_t b, int x)
{
        return ((a << (x)) | (b >> (64 - x)));
}


More information about the Gcc-bugs mailing list