[Bug target/126454] [16/17 Regression] RISCV: cm.popretz pass deletes "li a0,0" and gives wrong return value

wren6991 at gmail dot com via Gcc-bugs <[email protected]> Sun, 02 Aug 2026 18:59:34 +0000
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
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);