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

            Bug ID: 77647
           Summary: Missed opportunity to use register value causes
                    additional load
           Product: gcc
           Version: 6.2.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: npiggin at gmail dot com
  Target Milestone: ---

static inline long load(long *p)
{
        long ret;
        asm ("movq      %1,%0\n\t" : "=r" (ret) : "m" (*p));
        if (ret != *p)
                __builtin_unreachable();
        return ret;
}

long foo(long *mem)
{
        long ret;
        ret = load(mem);
        return ret - *mem;
}

foo() compiles down to 'xorl %eax,%eax ; ret' which is great. Changing the
minus to plus gives

        movq    (%rdi),%rax
        addq    (%rdi),%rax
        ret

Reply via email to