Issue 146652
Summary [Clang][TBAA] Clang's TBAA is too conservative than GCC when long type cast?
Labels llvm:optimizations, missed-optimization, TBAA
Assignees
Reporter hstk30-hw
    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.

_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to