[Bug middle-end/107115] Wrong codegen from TBAA under stores that change effective type?

gabravier at gmail dot com gcc-bugzilla@gcc.gnu.org
Tue Dec 27 22:21:41 GMT 2022


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107115

--- Comment #14 from Gabriel Ravier <gabravier at gmail dot com> ---
Actually I think there's some aliasing violations in the C++ code w.r.t. the
re-usage of `p4` after another object has been created in its place so I think
this code would be more correct:

void test1(long *p1)
{
    p1 = (long *)new ((char*)p1) char[sizeof(long)];
    p1[0] = 1;
}

long test2(long long *p2, int index1, int index2)
{
    p2 = (long long *)new ((char*)p2) char[sizeof(long long)];
    p2[index1] = 2;
    return p2[index2];
}

long test3(long *p3, int index2, long value)
{
    p3 = (long *)new ((char*)p3) char[sizeof(long)];
    p3[index2] = 3;
    p3[index2] = value;
    return p3[0];
}

long test4(void *p4, int index1, int index2)
{
    test1((long *)p4);
    long temp = test2((long long *)std::launder((long *)p4), index1, index2);
    return test3((long *)std::launder((long long *)p4), index2, temp);
}

long (*volatile vtest)(void *, int, int) = test4;

int main(void)
{
    void *pp = malloc(sizeof(long long));
    if (!pp) abort();
    long result = vtest(pp, 0, 0);
    printf("%lu/%lu\n", *std::launder((long *)pp), result);
}


More information about the Gcc-bugs mailing list