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.

Reply via email to