https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119980
Bug ID: 119980
Summary: wrong aliasing decision with structure acces
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: uecker at gcc dot gnu.org
Target Milestone: ---
In the following example, there seems to be an incorrect aliasing decision. The
function should return 2 but returns 1 (adapted from an example by John Payson)
#include <stdlib.h>
#include <stdio.h>
typedef struct foo { int x; } F;
typedef struct bar { int x; } B;
static int foo(void *p, int i, int j, int v)
{
F *pp = p;
pp[i] = (F){ v };
return pp[j].x;
}
static int bar(void *p, int i, int j, int v)
{
B *pp = p;
pp[i] = (B){ v };
return pp[j].x;
}
[[gnu::noinline]]
int test(void *fp, int i, int j, int k)
{
foo(fp, i, j, 1);
int s = bar(fp, j, k, 2);
// printf("%d", s);
return foo(fp, k, i, s);
}
int main()
{
void *fp = malloc(sizeof(F));
if (!fp) return -1;
return test(fp, 0, 0, 0);
}