[clang] [TBAA] Generate tbaa.struct single field with char tag for unions. (PR #84370)

Florian Hahn via cfe-commits cfe-commits at lists.llvm.org
Mon Mar 11 11:13:36 PDT 2024


fhahn wrote:

> Do you have a testcase that shows how this goes wrong without this change ?

I am not 100% if the type-based aliasing rules allow aliasing a union access containing a float and a plain pointer to float, but I am thinking about something like the below, where we remove the first store to `f`, even though `f` may alias the union if the float is selected. Again, not sure if that's 100% within the C/C++ type-based aliasing rules, but it is what I could construct easily. 

Irrespective of this it should show how the TBAA tags for the load of `u` incorrectly claims it is loading an int.


```
union U2 {
  int d;
  float f;
};

struct UnionMember2 {
  int p;
  U2 u;
};

void use(int, U2);
void copy12( UnionMember2 *a2, float *f) {
  *f = 1.0;
  UnionMember2 a1 = *a2;
  int p = a1.p;
  U2 u = a1.u;
  *f = 2.0;
  use(p, u);
}
```

https://clang.godbolt.org/z/Y6PPWEo69

https://github.com/llvm/llvm-project/pull/84370


More information about the cfe-commits mailing list