"H.J. Lu" <[email protected]> writes: > On Fri, May 22, 2026 at 3:41 PM Richard Sandiford > <[email protected]> wrote: >> >> "H.J. Lu" <[email protected]> writes: >> > Since flow_active_insn_p has: >> > >> > if ((GET_CODE (PATTERN (insn)) == CLOBBER >> > || GET_CODE (PATTERN (insn)) == USE) >> > && REG_P (XEXP (PATTERN (insn), 0)) >> > && REG_FUNCTION_VALUE_P (XEXP (PATTERN (insn), 0))) >> > return true; >> > >> > update DCE to always keep return value clobber. >> > >> > Adjust assembly scan in gcc.target/i386/zero-scratch-regs-30.c to also >> > expect 8 "fstp %st(0)" in 64-bit mode for extra insns: >> > >> > flds .LC2(%rip) // +QNaN >> > flds .LC2(%rip) // +QNaN >> > fstp %st(0) >> > fstp %st(0) >> > >> > since return value clobber: >> > >> > (insn 10 2 11 2 (clobber (reg/i:XC 8 st)) "zero-scratch-regs-30.c":7:1 -1 >> > (nil)) >> > >> > is no longer removed as without -fzero-call-used-regs=all. >> > >> > PR rtl-optimization/125375 >> > * dce.cc: (deletable_insn_p): Always keep return value clobber. >> >> We shouldn't need to keep the clobber for correctness. It's just >> supposed to be an optimisation crutch to prevent the return register >> from becoming unnecessarily upwards exposed. >> >> I think there's a deeper issue here. > > Any ideas about what the deeper issue is?
I've added a comment to the PR. There seems to be some woolliness about what "forwarder block" means in an RTL context. Richard
