https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95442
Vladimir Makarov <vmakarov at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |vmakarov at gcc dot gnu.org
--- Comment #3 from Vladimir Makarov <vmakarov at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #2)
> The code now does:
> if (find_reg_note (curr_insn, REG_UNUSED, out_rtx) == NULL_RTX)
> {
> reg = SUBREG_P (out_rtx) ? SUBREG_REG (out_rtx) : out_rtx;
> start_sequence ();
> /* If we had strict_low_part, use it also in reload to keep other
> parts unchanged but do it only for regs as strict_low_part
> has no sense for memory and probably there is no insn pattern
> to match the reload insn in memory case. */
> if (out >= 0 && curr_static_id->operand[out].strict_low && REG_P (reg))
> out_rtx = gen_rtx_STRICT_LOW_PART (VOIDmode, out_rtx);
> lra_emit_move (out_rtx, copy_rtx (new_out_reg));
> emit_insn (*after);
> *after = end_sequence ();
> }
>
>
> Do you have a testcase for this issue/?
I believe it is an artifact of wrong DEAD and UNUSED notes generation by LRA.
I doubt that LRA now generates one REG_DEAD for output. I believe it was fixed
long ago by https://gcc.gnu.org/pipermail/gcc-bugs/2024-December/891716.html
for PR117248.
In any case I checked the only REG_DEAD generation for output. I did not
find such case on all x86-64 tests and bootstrap. So I think this PR has been
solved.