It's the test case that is miscompiled. $ cat nested_struct.c #include <stdio.h>
typedef struct cls_struct_16byte1 { double a; float b; int c; } cls_struct_16byte1; typedef struct cls_struct_16byte2 { int ii; double dd; float ff; } cls_struct_16byte2; typedef struct cls_struct_combined { cls_struct_16byte1 d; cls_struct_16byte2 e; } cls_struct_combined; void cls_struct_combined_fn(struct cls_struct_16byte1 b0, struct cls_struct_16byte2 b1, struct cls_struct_combined b2) { struct cls_struct_combined result; printf("%g %g %d %d %g %g %g %g %d %d %g %g\n", b0.a, b0.b, b0.c, b1.ii, b1.dd, b1.ff, b2.d.a, b2.d.b, b2.d.c, b2.e.ii, b2.e.dd, b2.e.ff); } $ cat main.c typedef struct cls_struct_16byte1 { double a; float b; int c; } cls_struct_16byte1; typedef struct cls_struct_16byte2 { int ii; double dd; float ff; } cls_struct_16byte2; typedef struct cls_struct_combined { cls_struct_16byte1 d; cls_struct_16byte2 e; } cls_struct_combined; void cls_struct_combined_fn (struct cls_struct_16byte1, struct cls_struct_16byte2, struct cls_struct_combined); int main (void) { struct cls_struct_16byte1 e_dbl = { 9.0, 2.0, 6}; struct cls_struct_16byte2 f_dbl = { 1, 2.0, 3.0}; struct cls_struct_combined g_dbl = {{4.0, 5.0, 6}, {3, 1.0, 8.0}}; cls_struct_combined_fn (e_dbl, f_dbl, g_dbl); } $ bad/gcc/xgcc -Bbad/gcc/ -O2 -c nested_struct.c $ good/gcc/xgcc -Bgood/gcc/ -O2 main.c nested_struct.o $ ./a.out 9 2 6 1 2 3 1.32677e-313 5 6 3 1 8 --- good/nested_struct.s +++ bad/nested_struct.s @@ -25,78 +25,69 @@ cls_struct_combined_fn: movl r43 = @gprel(.LC0) ;; .mmi - adds r16 = 120, r12 - adds r17 = 72, r12 - adds r18 = 96, r12 + adds r14 = 120, r12 + adds r16 = 72, r12 + adds r15 = 96, r12 .mmi - adds r19 = 152, r12 - adds r15 = 88, r12 adds r21 = 48, r12 - ;; - .mmi - mov r14 = r16 - ldfs f9 = [r19] - adds r19 = 144, r12 - .mmi - st8 [r17] = r33 - st8 [r18] = r36 adds r20 = 40, r12 + adds r18 = 32, r12 ;; - .mmb + .mmi st8 [r14] = r37, 8 - ldfs f8 = [r18] - nop 0 - .mii - adds r18 = 24, r12 + st8 [r16] = r33 .save rp, r40 mov r40 = b0 .body + .mmi + adds r17 = 24, r12 + adds r22 = 136, r12 add r43 = r1, r43 ;; + .mmb + ldfs f8 = [r16] + adds r16 = 152, r12 + nop 0 .mmi - ldfs f7 = [r17] st8 [r14] = r38 + st8 [r15] = r36 extr.u r38 = r38, 32, 32 - .mmi - st8 [r15] = r35 - ldfd f10 = [r19] - adds r17 = 64, r12 ;; .mmi ldfs f6 = [r14] - st8 [r17] = r32 - adds r14 = 136, r12 + st8 [r22] = r39 + nop 0 .mmi - adds r19 = 32, r12 - ld8 r50 = [r16] - adds r17 = 16, r12 + ldfs f9 = [r15] + ldfs f7 = [r16] + adds r16 = 144, r12 ;; .mmi - st8 [r14] = r39 - nop 0 - adds r14 = 76, r12 + ldfd f10 = [r16] + adds r16 = 64, r12 + adds r15 = 88, r12 .mmi - ld8 r48 = [r15] - st4 [r19] = r39 - nop 0 + ld8 r50 = [r14] + st4 [r18] = r39 + adds r14 = 76, r12 ;; .mmi - nop 0 + st8 [r16] = r32 ld4 r46 = [r14] - adds r14 = 64, r12 + adds r16 = 16, r12 .mmi - nop 0 - st4 [r18] = r38 + adds r14 = 64, r12 + st8 [r15] = r35 nop 0 ;; - .mfi + .mmi nop 0 - fnorm.d f9 = f9 + ld8 r48 = [r15] nop 0 .mmi + st4 [r17] = r38 ld8 r44 = [r14] nop 0 - nop 0 ;; .mmf nop 0 @@ -105,31 +96,30 @@ cls_struct_combined_fn: ;; .mfi nop 0 - fnorm.d f7 = f7 + fnorm.d f9 = f9 nop 0 - .mmi - stfd [r20] = f10 + .mfi nop 0 + fnorm.d f7 = f7 nop 0 ;; - .mmf - nop 0 + .mfi nop 0 fnorm.d f6 = f6 - ;; + nop 0 .mmi - stfd [r21] = f9 + stfd [r20] = f10 ;; - getf.d r49 = f8 + getf.d r45 = f8 nop 0 ;; .mmi - nop 0 - getf.d r45 = f7 + getf.d r49 = f9 + stfd [r21] = f7 nop 0 ;; .mib - stfd [r17] = f6 + stfd [r16] = f6 nop 0 br.call.sptk.many b0 = printf# ;; Andreas. -- Andreas Schwab, SUSE Labs, sch...@suse.de GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE 1748 E4D4 88E3 0EEA B9D7 "And now for something completely different."