https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125375
--- Comment #13 from H.J. Lu <hjl.tools at gmail dot com> ---
Return register clobber:
(code_label 83 82 84 17 2 (nil) [4 uses])
(note 84 83 85 17 [bb 17] NOTE_INSN_BASIC_BLOCK)
(insn 85 84 86 17 (clobber (reg/i:SI 0 ax)) "x.c":24:1 -1
(nil))
(insn 86 85 87 17 (clobber (reg:SI 133 [ <retval> ])) "x.c":24:1 -1
(nil))
(jump_insn 87 86 88 17 (set (pc)
(label_ref 97)) "x.c":24:1 -1
(nil)
-> 97)
is added by
void
clobber_return_register (void)
{
diddle_return_value (do_clobber_return_reg, NULL);
/* In case we do use pseudo to return value, clobber it too. */
if (DECL_RTL_SET_P (DECL_RESULT (current_function_decl)))
{
tree decl_result = DECL_RESULT (current_function_decl);
rtx decl_rtl = DECL_RTL (decl_result);
if (REG_P (decl_rtl) && REGNO (decl_rtl) >= FIRST_PSEUDO_REGISTER)
{
do_clobber_return_reg (decl_rtl, NULL);
}
}
}
Removing
(insn 98 100 99 19 (set (reg/i:SI 0 ax)
(reg:SI 0 ax [orig:133 <retval> ] [133])) "x.c":24:1 100
{*movsi_interna
l}
(expr_list:REG_DEAD (reg:SI 0 ax [orig:133 <retval> ] [133])
(nil)))
without removing
(insn 85 84 86 17 (clobber (reg/i:SI 0 ax)) "x.c":24:1 -1
(nil))
leads to this issue. The pseudo return register clobber was added by
commit 9c65bbf460d325bf794a610e16ae941f723e3fef
Author: Jan Hubicka <[email protected]>
Date: Fri Jun 8 14:26:51 2001 +0200
function.c (clobber_return_register): Clobber the pseudo return register
too.
It is unclear why it is needed.