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);