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

            Bug ID: 94804
           Summary: Failure to elide useless movs in 128-bit addition
           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: ---

using i128 = __int128;

i128 add128(i128 a, i128 b)
{
    return a + b;
}

This is how LLVM handles this code : 

add128(__int128, __int128):
  mov rax, rdi
  add rax, rdx
  adc rsi, rcx
  mov rdx, rsi
  ret

GCC seems to have an insistence on moving `b` from its original registers
before actually doing the addition : 

add128(__int128, __int128):
  mov r9, rdi ; useless
  mov rax, rdx
  mov r8, rsi ; useless
  mov rdx, rcx
  add rax, r9 ; could just have used rdi
  adc rdx, r8 ; could just have used rsi
  ret

This seems to be specific to x86_64 : It does not occur on aarch64 or ppc64le

Reply via email to