hfinkel added a comment. In https://reviews.llvm.org/D31885#727371, @efriedma wrote:
> In https://reviews.llvm.org/D31885#727167, @hfinkel wrote: > > > I'm not sure this is the right way to do this; I suspect we're lumping > > together a bunch of different bugs: > > > > 1. vector types need to have tbaa which makes them alias with their element > > types [to be clear, as vector types are an implementation extension, this > > is our choice; I believe most users expect this to be true, but I'm > > certainly open to leaving this as-is (i.e. the vector types and scalar > > types as independent/non-aliasing)]. > > 2. tbaa can't be used for write <-> write queries (only read <-> write > > queries) because the writes can change the effective type > > 3. our 'struct' path TBAA for unions is broken (and to fix this we need to > > invert the tree structure, etc. as discussed on the list) > > > See https://bugs.llvm.org/show_bug.cgi?id=28189 for a testcase for (2) for > this which doesn't involve unions. Yes, this is what I had in mind. However, we may just want to not handle this at all. The demonstration you provide: #include <stdio.h> #include <string.h> #include <stdlib.h> int f(int* x, int *y) { *x = 10; int z = *y; *(float*)x = 1.0; return z; } int (*ff)(int*,int*) = f; int main() { void* x = malloc(4); printf("%d\n", ff(x, x)); } shows that the problem is more than I implied. To support this, we not only need to ignore the TBAA between the two writes (*x and *(float*)x), but also between the float write and the preceding int read. I wonder how much of TBAA we could keep at all and still support this. Thoughts? Repository: rL LLVM https://reviews.llvm.org/D31885 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits