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

    <tr>
        <th>Summary</th>
        <td>
            [InstCombine][TBAA] Miss optimization for check redundancy load
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            llvm:optimizations,
            llvm:instcombine,
            missed-optimization,
            TBAA
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          hstk30-hw
      </td>
    </tr>
</table>

<pre>
    https://godbolt.org/z/b6vfG688K

```
typedef long int intptr_t;
typedef unsigned char uint8_t;
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long int uint64_t;

typedef struct {
    union {
        uint8_t u6_ucaddr[16];
 uint16_t u6_usaddr[8];
        uint32_t u6_uladdr[4];
 uint64_t u6_ulladdr[2];
    } u6_addr;
} In6Addr;

struct policy_match_cond {
    In6Addr src_ipv6;
    In6Addr dst_ipv6;
};

typedef struct mbuf {
    void *userdata;
} __attribute__((__aligned__(64))) Mbuf;

typedef struct {
    In6Addr src_ip;
    In6Addr dst_ip;
} __attribute__((__aligned__(64))) MbufContext;

void test(Mbuf *mbuf, struct policy_match_cond *condition)
{
(condition->dst_ipv6.u6_addr.u6_uladdr)[0] = ((((((((MbufContext *)((mbuf))->userdata))->dst_ip).u6_addr.u6_uladdr)[0])&0xFF000000) >> 24);
(condition->dst_ipv6.u6_addr.u6_uladdr)[1] = ((((((((MbufContext *)((mbuf))->userdata))->dst_ip).u6_addr.u6_uladdr)[1])&0xFF000000) >> 24);
}
```

Clang is one more load than GCC.

The primary cause maybe clang not handle union's TBAA, like issue https://github.com/llvm/llvm-project/issues/146652. 

But in this case, we might be able to delete the second load in InstCombine step :)
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzEVU2P4ygQ_TXkUuoI4--DD07SGY1WfZu7hYHEbNsQmXJmMr9-Bc6Hu1fZz8O0aFmpehTvPUoFd04fjVIVSTck3a34hJ0dq87he0xfuu-r1spL1SGeHIlrwvaE7Y9WtrbHtR2PhO1_ErZvs_PhS1YUvxFa-5XR66I1Xk5KqgP01hxBG_T_JxwbJPFmkZ5M4CFBdHyESRssnkJcZ8dQJ-Ci7CnwBonZU8idlsdlyQ23gDocJ4FAch8HAJiMtmbxO8RmwjBlzSS4lCNJN1FG0t1c7k40ANwVUDzyizKebID1V1jysYwnOedvAPahDsl3Ph1ys5Z8B19NVj8CtL6KOtlei0szcBRdI6yRC1nXLeBG0ejTOXuccMtIh4sMyXfPvBva6bCofLZaAmH15NQoOfIHzabhiKNuJ1RNQ1hBWNE0vA9XFQJZQlg5L3hrp8Pf39ZHGc9E_A8KW2tQ_Xj0TVCHyiFhxVsQzmpvAGFbeG47q_1Xo7bG1_ZcQj1W3OMvJH69Wb6-3vD60SisJOmGknQHJN7BzPzPa8HYHxp0-PjM0Ivyx9xv5h652sTKvzo5wDP6Y7-n4c9bROJXEr8CC67F_0VT9Ms0Rf9cU777NPcIrbc998PFgTUKBjsq6C2XgB038GW7Xc-ob52C06gHPl5A8MkpGPilVSDCbmMROm5kr-a5Q1ju4Numrn079fpdgXZuUvBpQmvspnYt7EDYvu_Pt8_LabS_K4GE7cM2R9g-SrIsZWuY2WwmP1kBO-1AcKf8Md8VDPrYIbQKeNsrQAtS9QoVYKfAqdDCQZs28NU43Nqh1UaBQ3WCwKpcySqWZVzylaqiPI3KhJYZXXVV3B5ypRiNc5nnUuTqwNtMiCLJY1qmWbzSFaMspTktKIsySteJbNkhaotIiJxKlpCEqoHrfu0l-ldpFcRVUZInSbnqeat6Fx44xoIZcW1PqAf9k_sedIQxwraPpDYOxazgnhq0c0q-LPfdc_N1-Cm8GqtgczsdHUlorx26ByvU2IeHdmGR77B0EyqkO3jTzsHyDDjYEUSnxDuMSk5GciMuwerVNPaf3-V_devBm3PF_ggAAP__C6lvZg">