This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Aliasing of arrays


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]