This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Aliasing of arrays
- From: Alexander Cherepanov <ch3root at openwall dot com>
- To: GCC Development <gcc at gcc dot gnu dot org>
- Date: Wed, 30 Nov 2016 16:19:09 +0300
- Subject: Aliasing of arrays
- Authentication-results: sourceware.org; auth=none
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