This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug c/14319] New: incorrect optimization of union of structs with common initial sequences
- From: "jsturm at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 27 Feb 2004 05:29:24 -0000
- Subject: [Bug c/14319] New: incorrect optimization of union of structs with common initial sequences
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
Given:
struct X {int x;};
struct Y {int y;};
union U {struct X x; struct Y y;};
int f(struct X *xp, struct Y *yp) {
xp->x = 0;
yp->y = 1;
return xp->x;
}
int main(void) {
union U u;
return f(&u.x, &u.y);
}
gcc from tree-ssa decides that xp->x and yp->y do not conflict, despite the
presence of a union. Compiled with -O2, this program returns 1 for mainline, 0
for tree-ssa.
See discussion in http://gcc.gnu.org/ml/gcc/2004-02/msg01070.html and DR 257
(http://std.dkuug.dk/JTC1/SC22/WG14/www/docs/dr_257.htm).
6.5.2.3#5 reads:
[#5] One special guarantee is made in order to simplify the use of unions:
if a union contains several structures that share a common initial sequence (see
below), and if the union object currently contains one of these structures, it
is permitted to inspect the common initial part of any of them anywhere that a
declaration of the complete type of the union is visible. Two structures share a
common initial sequence if corresponding members have compatible types (and, for
bit-fields, the same widths) for a sequence of one or more initial members.
The structs X and Y in the example above have a common initial sequence and are
contained in a visible union declaration, so depending on how one interprets the
statement in 6.5.2.3#5 (I am certainly not an expert) either the code example is
invalid, or the compiler must assume the members of X and Y can alias.
--
Summary: incorrect optimization of union of structs with common
initial sequences
Product: gcc
Version: tree-ssa
Status: UNCONFIRMED
Keywords: wrong-code
Severity: normal
Priority: P2
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: jsturm at gcc dot gnu dot org
CC: gcc-bugs at gcc dot gnu dot org
GCC host triplet: i686-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14319