Thanks Kito, sent v2 for addressing comments.

Pan

-----Original Message-----
From: Kito Cheng <kito.ch...@gmail.com> 
Sent: Monday, April 29, 2024 2:37 PM
To: juzhe.zh...@rivai.ai
Cc: Li, Pan2 <pan2...@intel.com>; gcc-patches <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH v1] RISC-V: Fix ICE for legitimize move on subreg 
const_poly_move

> diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
> index 0519e0679ed..bad23ea487f 100644
> --- a/gcc/config/riscv/riscv.cc
> +++ b/gcc/config/riscv/riscv.cc
> @@ -2786,6 +2786,44 @@ riscv_v_adjust_scalable_frame (rtx target, poly_int64 
> offset, bool epilogue)
>    REG_NOTES (insn) = dwarf;
> }
> +/* Take care below subreg const_poly_int move:
> +
> +   1. (set (subreg:DI (reg:TI 237) 8)
> +    (subreg:DI (const_poly_int:TI [4, 2]) 8))
> +      =>
> +      (set (subreg:DI (reg:TI 237) 8)
> +    (const_int 0)) */
> +
> +static bool
> +riscv_legitimize_subreg_const_poly_move (machine_mode mode, rtx dest, rtx 
> src)
> +{
> +  gcc_assert (SUBREG_P (src) && CONST_POLY_INT_P (SUBREG_REG (src)));
> +  gcc_assert (SUBREG_BYTE (src).is_constant ());
> +
> +  int byte_offset = SUBREG_BYTE (src).to_constant ();
> +  rtx const_poly = SUBREG_REG (src);
> +  machine_mode subreg_mode = GET_MODE (const_poly);
> +
> +  if (subreg_mode != TImode) /* Only TImode is needed for now.  */
> +    return false;
> +
> +  if (byte_offset == 8)
> +    { /* The const_poly_int cannot exceed int64, just set zero here.  */

{
 /* The const_poly_int cannot exceed int64, just set zero here.  */

New line for the comment.

> +      emit_move_insn (dest, CONST0_RTX (mode));
> +      return true;
> +    }
> +
> +  /* The below transform will be covered in somewhere else.
> +     Thus, ignore this here.
> +   1. (set (subreg:DI (reg:TI 237) 0)
> +    (subreg:DI (const_poly_int:TI [4, 2]) 0))
> +      =>
> +      (set (subreg:DI (reg:TI 237) 0)
> +    (const_poly_int:DI [4, 2])) */
> +
> +  return false;
> +}
> +
> /* If (set DEST SRC) is not a valid move instruction, emit an equivalent
>     sequence that is valid.  */
> @@ -2839,6 +2877,11 @@ riscv_legitimize_move (machine_mode mode, rtx dest, 
> rtx src)
> }
>        return true;
>      }
> +
> +  if (SUBREG_P (src) && CONST_POLY_INT_P (SUBREG_REG (src))
> +    && riscv_legitimize_subreg_const_poly_move (mode, dest, src))
> +    return true;
> +
>    /* Expand
>         (set (reg:DI target) (subreg:DI (reg:V8QI reg) 0))
>       Expand this data movement instead of simply forbid it since
> --
> 2.34.1
>
>

Reply via email to