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

--- Comment #4 from Luke Wren <wren6991 at gmail dot com> ---
Stopping the backtrack when encountering a call is enough to fix the
MicroPython regression for me:

--- a/gcc/config/riscv/riscv-opt-popretz.cc
+++ b/gcc/config/riscv/riscv-opt-popretz.cc
@@ -217,12 +217,15 @@ pass_combine_popretz::execute (function *fn)
       for (rtx_insn *def_insn = PREV_INSN (popret_insn);
           def_insn && def_insn != PREV_INSN (BB_HEAD (bb));
           def_insn = PREV_INSN (def_insn))
        {
          if (!INSN_P (def_insn))
            continue;
+         /* a0 is not preserved across calls:  */
+         if (CALL_P (def_insn))
+           break;
          rtx def_pat = PATTERN (def_insn);
          if (GET_CODE (def_pat) == USE
              && REG_P (XEXP (def_pat, 0))
              && REGNO (XEXP (def_pat, 0)) == A0_REGNUM)
            {
              a0_reg = XEXP (def_pat, 0);

Reply via email to