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

--- Comment #4 from Alex Coplan <acoplan at gcc dot gnu.org> ---
So pro_and_epilogue has:

```
(insn/f 55 54 56 2 (set (mem/c:DI (plus:DI (reg/f:DI 31 sp)
                (const_int 16 [0x10])) [2  S8 A8])
        (reg:DI 19 x19)) "t.c":2:28 -1
     (expr_list:REG_CFA_OFFSET (set (mem/c:DI (plus:DI (reg/f:DI 31 sp)
                    (const_int 16 [0x10])) [2  S8 A8])
            (reg:DI 19 x19))
        (nil)))
(insn/f 56 55 57 2 (set (reg:DI 13 x13)
        (plus:DI (reg/f:DI 31 sp)
            (const_int -1048576 [0xfffffffffff00000]))) "t.c":2:28 -1
     (expr_list:REG_CFA_DEF_CFA (plus:DI (reg:DI 13 x13)
            (const_int 1048576 [0x100000]))
        (nil)))
(insn/f 57 56 58 2 (set (reg/f:DI 31 sp)
        (unspec_volatile:DI [
                (reg/f:DI 31 sp)
                (reg:DI 13 x13)
            ] UNSPECV_PROBE_STACK_RANGE)) "t.c":2:28 -1
     (expr_list:REG_CFA_DEF_CFA (plus:DI (reg/f:DI 31 sp)
            (const_int 1048576 [0x100000]))
        (nil)))
```

which seems fine because in insn 55 the sp is the CFA, insn 56
changes the CFA to x13, and insn 57 changes it back to sp.
But by the time we get to dwarf2 we have:

```
(insn/f 56 54 55 (set (reg:DI 13 x13)
        (plus:DI (reg/f:DI 31 sp)
            (const_int -1048576 [0xfffffffffff00000]))) "t.c":2:28 120
{*adddi3_aarch64}
     (expr_list:REG_CFA_DEF_CFA (plus:DI (reg:DI 13 x13)
            (const_int 1048576 [0x100000]))
        (nil)))
(insn/f:TI 55 56 57 (set (mem/c:DI (plus:DI (reg/f:DI 31 sp)
                (const_int 16 [0x10])) [2  S8 A8])
        (reg:DI 19 x19)) "t.c":2:28 70 {*movdi_aarch64}
     (expr_list:REG_DEAD (reg:DI 19 x19)
        (expr_list:REG_CFA_OFFSET (set (mem/c:DI (plus:DI (reg/f:DI 31 sp)
                        (const_int 16 [0x10])) [2  S8 A8])
                (reg:DI 19 x19))
            (nil))))
(insn/f 57 55 58 (set (reg/f:DI 31 sp)
        (unspec_volatile:DI [
                (reg/f:DI 31 sp)
                (reg:DI 13 x13)
            ] UNSPECV_PROBE_STACK_RANGE)) "t.c":2:28 1151 {probe_stack_range}
     (expr_list:REG_DEAD (reg:DI 13 x13)
        (expr_list:REG_CFA_DEF_CFA (plus:DI (reg/f:DI 31 sp)
                (const_int 1048576 [0x100000]))
            (nil))))
```

i.e. the insns have been re-ordered, so now the CFA gets changed to
x13 in insn 56 and so the `REG_CFA_OFFSET` note in insn 55 becomes invalid,
because the CFA is no longer the sp when we process that insn.

Not immediately sure what the right fix is, will investigate further.

Reply via email to