[Bug tree-optimization/56576] New: wrong code for aliased union at -O3

dhazeghi at yahoo dot com gcc-bugzilla@gcc.gnu.org
Sat Mar 9 01:54:00 GMT 2013


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56576

             Bug #: 56576
           Summary: wrong code for aliased union at -O3
    Classification: Unclassified
           Product: gcc
           Version: 4.8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: dhazeghi@yahoo.com


The following code behaves differently at -O3 than at -O2 or below on 4.7 and
mainline 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 as expected on gcc 4.6 at all optimization levels (returns 0).

$ gcc-trunk --version
gcc-trunk (GCC) 4.8.0 20130308 (experimental) [trunk revision 196555]
$ gcc-trunk -O2 trans-reduced.c 
$ ./a.out 
$ echo $?
0
$ gcc-trunk -O3 trans-reduced.c 
$ ./a.out 
$ echo $?
1
$ gcc-4.6 -O3 trans-reduced.c 
$ ./a.out 
$ echo $?
0
$ cat trans-reduced.c 

/* gcc-4.7/gcc-trunk -O3 -m32/-m64 */
union
{
    int f0;
    int f1;
    long f2;
}
a, b;
int c, h;
int *d, *e = &a.f0;
long *f = &b.f2;
int **g = &d;
void fn1 ()
{
    c = 0;
    for (; c <= 3; c++)
    {
        int *i = &b.f1;
        *f = 1;
        *i = 0;
        *g = 0;
        h = *e;
    }
}

int main ()
{
    fn1 ();
    return b.f0;
}



More information about the Gcc-bugs mailing list