https://gcc.gnu.org/bugzilla/show_bug.cgi?id=97417
--- Comment #22 from Levy <admin at levyhsu dot com> --- Under condition if (GET_MODE_CLASS (mode) == MODE_INT && GET_MODE_SIZE (mode) < UNITS_PER_WORD && can_create_pseudo_p() && MEM_P (src)) with var: rtx temp_reg; int extend = (LOAD_EXTEND_OP (mode) == ZERO_EXTEND); I've tried the combination of: gen_extend_insn (temp_reg, force_reg (mode, src), word_mode, mode, extend); gen_extend_insn (temp_reg, force_reg (word_mode, src), word_mode, word_mode, extend); gen_extend_insn (temp_reg, src, word_mode, mode, extend); with: riscv_emit_move(dest, gen_lowpart (mode, temp_reg)); riscv_emit_move(dest, force_reg(mode, temp_reg)); then return true All raised segfault during make gcc. For example: if (GET_MODE_CLASS (mode) == MODE_INT && GET_MODE_SIZE (mode) < UNITS_PER_WORD && can_create_pseudo_p() && MEM_P (src)) { rtx temp_reg; int extend = (LOAD_EXTEND_OP (mode) == ZERO_EXTEND); gen_extend_insn (temp_reg, force_reg (mode, src), word_mode, mode, extend); riscv_emit_move(dest, force_reg(mode, temp_reg)); return true; } At beginning of riscv_legitimize_move()