https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117239

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #6 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
int a, b, j = 1, k;
int l () { return a; }
struct c {
  int d;
  int e;
  int f;
  int g;
  short h;
  int i;
};
void m (int n, struct c o) {
  if (o.i == 1)
    j = 0;
}
int r (struct c n) { return b; }
int main () {
  struct c q = {0, 0, 0, 0, 0, 1};
  k = r (q);
  m (l (), q);
  if (j != 0)
    __builtin_abort ();
  return 0;
}

Indeed, there is
(insn 14 12 15 2 (set (mem:DI (plus:DI (reg/f:DI 7 sp)
                (const_int 16 [0x10])) [0  S8 A64])
        (reg:DI 1 dx [orig:105 q+16 ] [105])) "pr117239.c":18:7 95
{*movdi_internal}
     (nil))
(call_insn/i 15 14 16 2 (set (reg:SI 0 ax)
        (call (mem:QI (symbol_ref:DI ("r") [flags 0x3]  <function_decl
0x7ffb2e2bdf00 r>) [0 r S1 A8])
            (const_int 24 [0x18]))) "pr117239.c":18:7 1476 {*call_value}
     (expr_list:REG_CALL_DECL (symbol_ref:DI ("r") [flags 0x3]  <function_decl
0x7ffb2e2bdf00 r>)
        (expr_list:REG_EH_REGION (const_int 0 [0])
            (nil)))
    (nil))
(insn 16 15 18 2 (parallel [
            (set (reg/f:DI 7 sp)
                (plus:DI (reg/f:DI 7 sp)
                    (const_int 24 [0x18])))
            (clobber (reg:CC 17 flags))
        ]) "pr117239.c":18:7 285 {*adddi_1}
     (expr_list:REG_ARGS_SIZE (const_int 0 [0])
        (nil)))
...
(call_insn/i 19 18 21 2 (set (reg:SI 0 ax)
        (call (mem:QI (symbol_ref:DI ("l") [flags 0x3]  <function_decl
0x7ffb2e2bdb00 l>) [0 l S1 A8])
            (const_int 0 [0]))) "pr117239.c":19:3 1476 {*call_value}
     (expr_list:REG_CALL_DECL (symbol_ref:DI ("l") [flags 0x3]  <function_decl
0x7ffb2e2bdb00 l>)
        (expr_list:REG_EH_REGION (const_int 0 [0])
            (nil)))
    (nil))
(insn 21 19 26 2 (parallel [
            (set (reg/f:DI 7 sp)
                (plus:DI (reg/f:DI 7 sp)
                    (const_int -24 [0xffffffffffffffe8])))
            (clobber (reg:CC 17 flags))
        ]) "pr117239.c":19:3 discrim 1 285 {*adddi_1}
     (expr_list:REG_ARGS_SIZE (const_int 24 [0x18])
        (nil)))
(insn 26 21 24 2 (set (mem:DI (plus:DI (reg/f:DI 7 sp)
                (const_int 16 [0x10])) [0  S8 A64])
        (reg:DI 1 dx [orig:105 q+16 ] [105])) "pr117239.c":19:3 discrim 1 95
{*movdi_internal}
     (nil))
So while %rsp+16 is the same on both stores and %rdx has not changed (IPA-RA?),
the stack deallocation followed by a call has clobbered it (without redzone
even the stack deallocation could have done it if there was an async signal in
between).

Reply via email to