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

LIU Hao <lh_mouse at 126 dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |lh_mouse at 126 dot com

--- Comment #12 from LIU Hao <lh_mouse at 126 dot com> ---
Is this the same issue?

https://gcc.godbolt.org/z/sTs3E9EP1
```
struct stack
  {
    void** base;
    unsigned int top, cap;
  };

struct context
  {
    void* data;
    stack* st;
  };

int
clear_stack(context& ctx)
  {
    ctx.st->top = 0;
    return 0;
  }
```

GCC reuses RAX for `ctx.st` and the return value, so an extra XOR is generated:
```
clear_stack(context&):
 mov    rax,QWORD PTR [rdi+0x8]
 xor    edx,edx                  <-- this would be unnecessary if
                                     `xor eax, eax` was lifted here
 mov    DWORD PTR [rax+0x8],edx
 xor    eax,eax
 ret
```

as in
```
clear_stack_2(context&):
 mov    rcx,QWORD PTR [rdi+0x8]    # 48 8b 4f 08
 xor    eax,eax                    # 31 c0
 mov    DWORD PTR [rcx+0x8],eax    # 89 41 08
 ret                               # c3
```

Reply via email to