Hello,
I've got a question for experts of alias analysis in GCC.
In the CLI back-end of GCC, there is a CLI-specific pass responsible of
some modifications on GIMPLE that simplify the emission of CIL bytecode
(see http://gcc.gnu.org/projects/cli.html#internals for more details).
One of such modifications makes sure that all ARRAY_REF nodes have zero
indexes. ARRAY_REFs with non-zero indexes are transformed into
zero-index equivalent plus some pointer arithmetics.
After noticing a failure of the CLI back-end in gcc.dg/struct-alias-1.c
test from the testsuite, I'm concerned that doing so may decrease the
effectiveness of GCC alias analysis.
For instance, let's consider the following struct definition (taken from
gcc.dg/struct-alias-1.c):
struct S {
int a[3];
int x;
};
This is the original code in GIMPLE pseudo-C dump representation:
s.x = 0;
i.0 = i;
s.a[i.0] = 1;
D.1416 = s.x;
if (D.1416 != 0) goto <L0>; else goto <L1>;
<L0>:;
link_error ();
This is the code after the CLI-specific array simplification:
s.x = 0;
i.0 = i;
cilsimp.1 = &s.a[0];
D.1423 = i.0 * 4;
D.1424 = D.1423 + cilsimp.1;
*D.1424 = 1;
D.1416 = s.x;
if (D.1416 != 0) goto <L0>; else goto <L1>;
<L0>:;
link_error ();
In the original code, GCC alias analysis understands that accesses to
s.x and s.a do not alias; therefore, it understands that the "then"
condition of the if statement is never taken.
In the modified code, the alias analysis conclude that access to s.x and
pointer D.1424 may alias.