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

            Bug ID: 82918
           Summary: No aliasing is possible on non equal pointers
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Keywords: alias, missed-optimization
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: antoshkka at gmail dot com
  Target Milestone: ---

Following code 

struct array {
    int data[3];
};

void foo2(array& value, const array& value2) {    
    if (&value == &value2) return;
    value.data[0] = value2.data[0];
    value.data[1] = value2.data[0];
    value.data[2] = value2.data[0];
}

produces the following assembly:

foo2(array&, array const&):
        cmp     rdi, rsi
        je      .L1
        mov     eax, DWORD PTR [rsi]
        mov     DWORD PTR [rdi], eax
        mov     eax, DWORD PTR [rsi]   <=== This is not required
        mov     DWORD PTR [rdi+4], eax
        mov     DWORD PTR [rdi+8], eax
.L1:
        rep ret

GCC already understands that value.data[1] and value.data[2] do not alias with
value2.data[0].

However GCC assumes that value1.data[0] may alias value2.data[0], which is not
possible, because of `if (&value == &value2) return;`

Please add the optimization, as it affects many cases, especially C++ assign
and move assign operators, where checking for `this == &rhs` is a common
pattern.

Reply via email to