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."

Reply via email to