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

--- Comment #7 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
```
(gdb) p classp->exp
$2 = (rtx) 0x7ffff739d810
(gdb) p debug_rtx(classp->exp)
(reg:DI 32 v0)
$3 = void
```

```
(insn 21 20 22 6 (set (reg:V2DI 32 v0)
        (const_vector:V2DI [
                (const_int 1 [0x1])
                (const_int 0 [0])
            ])) "t.c":22:3 1338 {*aarch64_simd_movv2di}
     (nil))
(call_insn 22 21 27 6 (parallel [
            (call (mem:DI (symbol_ref:DI ("p") [flags 0x3]  <function_decl
0x7f96c2526e00 p>) [0 p S8 A8])
                (const_int 0 [0]))
            (unspec:DI [
                    (const_int 2 [0x2])
                ] UNSPEC_CALLEE_ABI)
            (clobber (reg:DI 30 x30))
        ]) "t.c":22:3 97 {*call_insn}
     (expr_list:REG_CALL_DECL (symbol_ref:DI ("p") [flags 0x3]  <function_decl
0x7f96c2526e00 p>)
        (expr_list:REG_EH_REGION (const_int 0 [0])
            (nil)))
    (expr_list (clobber (reg:DI 17 x17))
        (expr_list (clobber (reg:DI 16 x16))
            (expr_list:V2DI (use (reg:V2DI 32 v0))
                (nil)))))
(insn 27 22 53 6 (set (reg:DI 121 [ _4+8 ])
        (mem/j/c:DI (plus:DI (reg/f:DI 130)
                (const_int 56 [0x38])) [1 BIT_FIELD_REF <n, 64, 192>+0 S8
A64])) "t.c":24:10 104 {*movdi_aarch64}
     (expr_list:REG_DEAD (reg/f:DI 130)
        (nil)))
(insn 53 27 54 6 (clobber (reg:OI 128 [ _4 ])) "t.c":24:10 -1
     (nil))
(insn 54 53 55 6 (set (subreg:DI (reg:OI 128 [ _4 ]) 0)
        (reg:DI 32 v0)) "t.c":24:10 104 {*movdi_aarch64}
     (nil))
```

This is why we need the function p around for IPA RA. we know that v0 is not
touched by the call.
So cse_local figures that out and uses v0 across the call.

But maybe cse misses that point and thinks v0 is clobbered ...

Reply via email to