Testcase: union A { float a; }; float t(float a) { union A a1, a2, a3; a1.a = a; for(int i =0;i<100;i++) { a2 = a1; a2.a += a; a1 = a2; } a3 = a1; return a3.a; }
-------------- We currently get on powerpc-linux-gnu in the inner loop: .L2: stw 0,8(1) lfs 0,8(1) fadds 0,1,0 stfs 0,8(1) lwz 0,8(1) bdnz .L2 Notice how we are storing and loading from the same address twice in the loop. That is bad news for the Cell. This also happens on x86: .L2: flds -4(%ebp) <--- load a1.a addl $1, %eax fadd %st(1), %st cmpl $100, %eax fstps -8(%ebp) <--- store a2.a movl -8(%ebp), %edx <--- load a2.a movl %edx, -4(%ebp) <--- store a1.a jne .L2 -- Summary: union cause ineffient code inside loops Product: gcc Version: 4.3.0 Status: UNCONFIRMED Keywords: missed-optimization Severity: normal Priority: P3 Component: tree-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: pinskia at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32964