aggregate alias anomaly
Jeff Sturm
jsturm@one-point.com
Thu Feb 19 05:40:00 GMT 2004
Given:
struct X {int x;};
struct Y {int y;};
int f(struct X *x, struct Y *y) {
x->x = 0;
y->y = 1;
return x->x;
}
gcc -O2 -fomit-frame-pointer yields:
f:
movl 4(%esp), %eax
movl 8(%esp), %edx
movl $0, (%eax)
movl $1, (%edx)
movl (%eax), %eax
ret
for every released compiler I tried, plus mainline. Note the useless load
of x->x, given that x and y cannot possibly have conflicting alias sets.
Currently, tree-ssa fares better:
f:
movl 4(%esp), %eax
movl $0, (%eax)
movl 8(%esp), %eax
movl $1, (%eax)
xorl %eax, %eax
ret
In both cases the alias sets appear correct, but mainline tests the alias
sets of `struct X' vs. `int' which must conflict, since the former is a
superset of the latter.
Since I'm no expert in RTL I'll ask: is this a known problem? Is it hard
to fix for some reason? (For tree-ssa I read the description of
may_alias_p, and it makes sense to me, whereas I'm lost in flow.c.)
As far as I can see, alias analysis for Java is useless on mainline.
Jeff
More information about the Gcc
mailing list