Hi!
Pascal Cuoq communicated to me the following example:
int ar1(int (*p)[3], int (*q)[3])
{
(*p)[0] = 1;
(*q)[1] = 2;
return (*p)[0];
}
gcc of versions 4.9.2 and 7.0.0 20161129 optimize it with -O2 on the
premise that elements with different indices don't alias:
0000000000000000 <ar1>:
0: c7 47 0c 01 00 00 00 movl $0x1,0xc(%rdi)
7: b8 01 00 00 00 mov $0x1,%eax
c: c7 46 10 02 00 00 00 movl $0x2,0x10(%rsi)
13: c3 retq
That's fine. But then I expect that gcc will also assume that arrays of
different known lengths don't alias, i.e. that gcc will optimize this
example:
int ar2(int (*p)[8], int (*q)[7]) {
(*p)[3] = 1;
(*q)[3] = 2;
return (*p)[3];
}
But this is not optimized:
0000000000000020 <ar2>:
20: c7 47 0c 01 00 00 00 movl $0x1,0xc(%rdi)
27: c7 46 0c 02 00 00 00 movl $0x2,0xc(%rsi)
2e: 8b 47 0c mov 0xc(%rdi),%eax
Is this behavior fully intentional, is the first example optimized too
aggressively, is an optimization missed in the second example, or is the
situation more complex?
--
Alexander Cherepanov