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

    <tr>
        <th>Summary</th>
        <td>
            [Clang][TBAA] Clang's TBAA is too conservative than GCC when long type cast?
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            llvm:optimizations,
            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/cnjvbzj9a

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

typedef struct MBuf {
    void *buf_addr;

    union {
        void *userdata;
        uint64_t udata64;
    };

} __attribute__((__aligned__(64))) MBuf_t;

typedef struct MBuf MBuf;

typedef union {
    struct {
        uint32_t srcIp;
 uint32_t dstIp;
        uint16_t srcPort;
        uint16_t dstPort;
        uint16_t vrfIndex;
        uint8_t protocol;
    } detail;
} FlowKey;

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;

typedef struct {
    uint16_t vsys_index;
    FlowKey packet_key;
    uint16_t dst_nat_port;
    uint32_t dst_nat_ip;

 struct {
        In6Addr src_ip;
        In6Addr dst_ip;
    } ipv6_pkt_info;

} __attribute__((__aligned__(64))) MbufContext;

typedef struct {
    _Bool is_ipv6;
    union {
        uint32_t v4;
 In6Addr v6;
    } addr;
} ip_addr_t;

typedef struct fc_fwd_flow_info_s {
    ip_addr_t src_ip;
    ip_addr_t src_natip;
    ip_addr_t dst_ip;
 ip_addr_t dst_natip;

    uint16_t vsys_id;
    uint16_t vrf_index;

 uint16_t src_port;
    uint16_t dst_port;
    uint16_t dst_natport;

 uint8_t proto;
    uint8_t nat_type;
} flow_info_t;

enum PORT_TYPE {
 TYPE_ONE,
    TYPE_TWO,
    TYPE_THREE,
    TYPE_FOUR,
    TYPE_FIVE,
 TYPE_MAX
};

void foo(MBuf *mbuf, flow_info_t *info)
{
 info->vsys_id = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->vsys_index);
    info->vrf_index = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->packet_key.detail.vrfIndex);
 info->proto = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->packet_key.detail.protocol);
 info->src_port = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->packet_key.detail.srcPort);
 info->dst_port = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->packet_key.detail.dstPort);
 info->dst_natport = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->dst_nat_port);
 info->dst_natip.addr.v4 = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->dst_nat_ip);

    switch (info->nat_type) {
        case TYPE_ONE: {
 info->src_ip.addr.v6 = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->ipv6_pkt_info.src_ip);
 info->dst_ip.addr.v6 = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->ipv6_pkt_info.dst_ip);
 break;
        }
        case TYPE_TWO:
            info->src_ip.addr.v4 = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->packet_key.detail.srcIp);
 info->dst_ip.addr.v4 = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->packet_key.detail.dstIp);
 break;
        case TYPE_THREE:
        case TYPE_FOUR:
        default: {
            info->src_ip.addr.v4 = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->packet_key.detail.srcIp);
 info->dst_ip.addr.v4 = (((MbufContext *)((uint8_t *)((MBuf*)(intptr_t)(mbuf))->userdata))->packet_key.detail.dstIp);
 break;
        }
    }
}
```

the TBAA matedata is `omnipotent char` cause the cast path have `uint8_t *`, 
I'm not familiar with GCC's TBAA, but I think there are potential for performance improvement.

</pre>

<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsWEtzozgQ_jXyRRUXFg-Hgw84jnddW7OZmsq-TpQAYTQBiZIEnsyv35JAPBw8c9hDctgqV2K6v5a-fqhbBktJz4yQHfD3wD-scKMKLnaFVC-uc1dcVgnPXneFUrUEbgTQEaDjmWcJL9WaizNAx-8AHVP2tU2-fw0xcCL9CZzuo15rkpEcNszsksG0wAI2lKn7WAF3D5zoDUQWXCiD2QTXoBlkETEsQ1m3iItuQkrOzgMu8K5xg5oyVSth1VM6SjSpgp_2TQ7BVishhLDlNIMARUmTxzjLxGCmlQ2jnE3AU4NGEpFhhTsDq7XkYKN1gTdqwfYwrA22BxjHWClBk0aROAboHqD7OMalcdYIAg-gsPsY0j9xSf95A7h2oDeYe2QDD6VIT3XPeBBmUg3CiYFOpjb4zIW6oc2k-oG2FfmJZeTbW_V9rGAtuOIpL2fxgxlRmPYy_Xws-eU38norLqObS4m0WzVB3KQm9f5-EwD_cIOwxsked78IM_HSsLKHeYuwrj40zOLQDKc9a4JpNW4P8MSCaFqet10dAixfZUznIe4DBmucvhAVv9jYXectZljF9Sx504IwalqPZ2WxrnrKukoG8LVOLzbVaVdp3QZx_aJiynL-H85M0uQPnCny7ebBGfnGe85LSGWsN584faNuTCBae7qtM1NLTXeeQVqblN4-xnka55cszkt-Ma7HcrLzYP0mnHMNw2pZOYv0XDyxWS6ibKFKWpFPq8v2DNsXFqpnKK4fqBhWo9auOTSEuZEW60LUYRzDPIZvXIWwpoKfn748x8__fH60UdXf46ffHwF66Fc1kue_nq4lv355vEYdn_74ci06_WlR5vlT9HfHaeBhZkfOOUD33RhCUZU0OUAPU9pabEofhca-yxjL-R1wH_uEQOAeYHcC9GJjqWtjcwC03EZpKjNzwj4Pw9I8dVz04dE7DQNukEw6CgonNWap2Yp4F3JjS1t3Y2I9TJiBrGVqiumDsBwm3RuW9hR9EKJ22L_haY_0B-Fprx2LPPv-8i5UZ3P1Fjtar3VnXrfeu3Kk9cDQXh0vVKUFNCt2jIfei8KrEZliScb26kbwqol1I6x3NHgXR2eXjHU_UxeT8qGI9lN8IJoIgl_mVys9cJZSoeeaG01U0949y8j7lN5ixzn9LCkfhWv3M-lHeZlkwtwnZrkYleZiMdNlJMdNqSbn6P8EvkcCx4PVfev_2tcn_Z2-IPB5H0WwworoPSGVEAQOrxituSJMmdcqIHBgihtJoDZIsVSwxqqABW6Jhk_dDRx9QQROdAJoW0HGFcxxRUuKBbxQVcBfHh4A2kqzr4YmjYInqArKXvTygkAsCOx2p7iEORewJiLnosIsJZBWteAtqQhTa-BEq2znZqEb4hXZbbb-xvN8z3VWxW7jp0Ho-eF2k6RJsAmDkCRZ7mBv46Bw4_orukMO8p2tg5x7d-uE64A4JAyRh7w0RSggwHNIpaNdlm215uK8olI2ZLfxgsBHqxInpJTm7RZCGgLciNeKVvQ7VpQzCRDSN2yEKiolye6mykHXhUH_pl6JnV7lLmnOEnhOSaWS49aKqtK8SnsoMTvrn-D-3tj6B9iJbFB1DhXnMOVMEtFiRVudOMx06OGlIKx7_6SnoUkmcI-rRpTXr-KoKppknfIKoKNxr_t3Vwv-laQKoKMJhwTo2Eek3aF_AwAA___DiNqW">