Issue 147449
Summary [InstCombine][TBAA] Miss optimization for check redundancy load
Labels llvm:optimizations, llvm:instcombine, missed-optimization, TBAA
Assignees
Reporter hstk30-hw
    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 :)
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to