The case you hit is s2 set in frame mask but s1 not. So you're trying to set s1 bit manually. If so, riscv_adjust_multi_push_cfi_prologue seems the better place for your change.
static rtx riscv_adjust_multi_push_cfi_prologue (int saved_size) { rtx dwarf = NULL_RTX; rtx adjust_sp_rtx, reg, mem, insn; unsigned int mask = cfun->machine->frame.mask; int offset; int saved_cnt = 0; - if (mask & S10_MASK) - mask |= S11_MASK; /* this corner case is covered in your for loop below. */ + unsigned num_multi_push = riscv_multi_push_regs_count (frame->mask); + for (int i = 0; i < num_multi_push; i++) + { + gcc_assert (zcmp_save_reg_order[i] != INVALID_REGNUM); + mask |= 1 << (zcmp_save_reg_order[i] - GP_REG_FIRST); /* here mask is used instead of frame->mask*/ + } ... BR Fei