Skip to content

[Clang][TBAA] Clang's TBAA is too conservative than GCC when long type cast? #146652

Open
@hstk30-hw

Description

@hstk30-hw

https://godbolt.org/z/cnjvbzj9a

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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions