http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56577
Bug #: 56577 Summary: wrong code for aliased union on gcc 4.7 only Classification: Unclassified Product: gcc Version: 4.7.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassig...@gcc.gnu.org ReportedBy: dhaze...@yahoo.com The following code behaves differently at -O3 than at -O2 or below on 4.7 on x86_64-linux. At -O3 it returns 1, whereas at -O2 and below it returns 0, for both -m32 and -m64 targets. It behaves consistently on gcc 4.6 at all optimization levels (returns 0). It may be related to 56576 (derived from a similar testcase) but that bug is also present on mainline. $ gcc-4.7 --version gcc-4.7 (GCC) 4.7.2 $ gcc-4.7 -O2 orig-reduced.c $ ./a.out $ echo $? 0 $ gcc-4.7 -O3 orig-reduced.c $ ./a.out $ echo $? 1 $ gcc-4.6 -O3 orig-reduced.c $ ./a.out $ echo $? 0 $ cat orig-reduced.c /* gcc-4.7 -O3 -m32/-m64 (works with trunk or at -O2) */ union { int f0; int f1; long f2; } b, *g, **i = &g; int a, m; int *c = (int *)&b.f2, *e, *f = &a; int d; int h; long **j = (long **)&c; int k; int **l = &e; void fn1 () { d = 0; for (; d <= 3; d++) { k = 0; for (; k <= 3; k++) { int *n = &b.f1; *i = 0; **j = 1; *n = 0; *l = 0; } m = *f; a = 1; for (; a >= 0; a--) h &= 1; } } int main () { fn1 (); return b.f0; }