for(i = 0;i<*t;i++)
*f += 1.0;
This one is pretty realistic, especially if you consider C++ and inlining:
struct s {
int size;
float *data;
};
void f(struct s *d, struct s *s)
{
int i;
for (i = 0; i < s->size; i++)
d->data[i] += s->data[i];
}
can be optimized by GCC to this:
lwz r0,0(r4)
cmpwi cr7,r0,0
blelr- cr7
lwz r3,4(r3)
mtctr r0
lwz r4,4(r4)
li r9,0
L4:
slwi r2,r9,2
addi r9,r9,1
lfsx f0,r3,r2
lfsx f13,r4,r2
fadds f0,f0,f13
stfsx f0,r3,r2
bdnz L4
blr
Note that the only load in the loop is for vec->data[i]. vec->size is
known not to change during the loop.
With an "int *data" it is impossible to disambiguate. However,
base+offset alias analysis can disambiguate the accesses to s->size and
d->data[i] if struct s is defined as follows:
struct s {
int size;
int data[1];
};
Paolo