Jiong Wang wrote:

test.c
===
struct K {
  int a;
  int b;
  int c;
  int d;
  char e;
  short f;
  long g;
  float h;
  double i;
};

void foo (int, struct K *);

void test (int i)
{
  struct K k = {
   .a = 5,
   .b = 0,
   .c = i,
  };

  foo (5, &k);
}

There are 2 separate latent bugs here, both unrelated to this patch. If I build 
with -fomit-frame pointer I get:

        str     x30, [sp, -64]!
        mov     w2, 5
        mov     x1, sp
        str     w2, [sp, 16]
        add     x1, x1, 20
        stp     xzr, xzr, [x1]
        add     x1, sp, 16
        str     w0, [sp, 24]
        mov     x0, sp
        add     x0, x0, 36
        stp     xzr, xzr, [x0]
        mov     w0, w2
        str     xzr, [sp, 52]
        str     wzr, [sp, 60]
        bl      foo
        ldr     x30, [sp], 64
        ret

If I use a compiler from early January (which also includes my patch) I get:

        str     x30, [sp, -64]!
        mov     w2, 5
        stp     xzr, xzr, [sp, 16]
        add     x1, sp, 16
        str     w0, [sp, 24]
        mov     w0, w2
        stp     xzr, xzr, [sp, 32]
        stp     xzr, xzr, [sp, 48]
        str     w2, [sp, 16]
        bl      foo
        ldr     x30, [sp], 64
        ret

Clearly a nasty regression was introduced in the structure initialization 
code...

Wilco

Reply via email to