<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/64437>64437</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            Missed optimization due to false aliasing of base subobjects
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          Eisenwave
      </td>
    </tr>
</table>

<pre>
    ## Code to Reproduce
```cpp
struct Base { int x; };
struct A : Base { };
struct B : Base { };

int get_noalias(A &a, B &b) {
    a.x = 1;
    b.x = 5;
    return a.x;
}
```
## Actual Output (`clang++ -O3` trunk)
```asm
get_noalias(A&, B&):
        mov dword ptr [rdi], 1
        mov     dword ptr [rsi], 5
        mov eax, dword ptr [rdi]
        ret
```
*See [live example at Compiler Explorer](https://godbolt.org/z/ME7nfharY)*

## Expected Output (delived by `g++ -O3` trunk)
```asm
get_noalias(A&, B&):
        mov DWORD PTR [rdi], 1
        mov     eax, 1
        mov     DWORD PTR [rsi], 5
        ret
```

## Explanation
According to [[basic.lval] p11](https://eel.is/c++draft/basic.lval#11), aliasing can only occur if the type of `a` is similar to one of the following:
- (11.1) `B` (impossible, because `a.x` and `b.x` require `a` to be `A` and `b` to be `B` respectively)
- (11.2) `signed A`/`unsigned A` (impossible)
- (11.3) `char`, `unsigned char`, or `std::byte` (impossible, `a.x` requires `a` not to be one of these types)

None of these rules are satisfied, so `a.x` should not be able to alias `b.x`. GCC recognizes this and provides optimal codegen, clang does not.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0Vctu6zYQ_Rp6M4ghUZZsLbSQ7Lir21ukBYquCooc2WxpUuXDsfP1BSknftwE6KaGIYHDM69zOBRzTu40YkPKjpSbGQt-b2zzLB3qV3bEWW_EuSG0ILSAtREI3sALjtaIwJFkG5K1pMqmPx_HyeK8DdxDxxwCWXYgtYcTKTogyw0pujtQC6Ror9BPEN3XiOkZw-_Q_6kNU5I5QlctEFoxQtfRmVY9oXX0neAAAGx-AlJsIP8IFa39xVreWS36YHV0ueZdbh56vywnolruA1PwPfgxeCB0FclRTO8I7Qjt4Ol7QaoMvA36b0Lrh1DMHSbLQ0-EVqmj9K5J0V5LjL-DOYJ4NVbA6C2QsrNCknITXfIfkfF3j3bv6PJHNLJT3Pks_B3Wov-Cl_ZXxOil5BEBT-wwKgTmYW0Oo1Ro4fk0KmPRpiJWe-9HF1ukW0K3OyN6o_zc2B2h2zdCt9-el3rYM_tHZIK2t6fhosHzaUTuUdyoIDBmF9CfgVTZ_y7G5vfvLxv45beX_yTGheIvdu9jfSXVl_Q_EKOYZl4aPdlbzo0VUu_ibKd7oOuZk3yujkyRcgNjnn-mCqKaS0folk9MCssGT-j2xpkWeZ4UWkNiLibhTIPR6gyG82BBDuD3CP48IpghCsOiHNKBkwepmI1VGZ02I3AwSplXqXcfnD9FbfN8nqcpr7Iu-hO6kofROCd7hTF_j5yFeIVUWZzkKgOmRVz108riP0Fa_CjAG-jTqr3F3u10k5-LB00eUZ0_js97SfRSUrpkBSRd6JZUWdA3psdiH4IUlyB8z2wKsIbbCDdmY1MyLyI3RdufPX7KxZWDS9fuo21t_KXBK-duksddpyM9f75D2KDQAbMIjnnpBokipnLmJpvbm6BEytEjsF6lz0k6GVcl5vDTeg0Wudlp-YYO_F66JMBozVEKdGBGLw9MATcCd6hjnnS9gjDoYvj5TDSFqIuazbDJqzrPl2VV1rN9wwSjuCoHzlZ8mS2Goa76IWPlgHVeV0M5kw3NaJGtskVeZ1lZz2ldc55zMRSC1znlZJHhgUk1V-p4iFfSTDoXsKkWi2I5U6xH5d4_p7aJoKc-7BxZZEo6765uXnqFzTfpHIqpJfmWxhJESMQMTDm8Do4ZoI8fQRd60_-F3LtZsKp5uCql34d-zs2B0G1MdXk9jdZEH0K3qdw4t6nifwMAAP__o3RI3w">