https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114639
--- Comment #12 from Li Pan <pan2.li at intel dot com> --- #include <riscv_vector.h> extern unsigned long get_vl (); #if 0 #else vint32m1_t test (vint32m1_t a) { unsigned b; return __riscv_vadd_vx_i32m1 (a, b, get_vl ()); // No ICE } vbool16_t test (vuint64m4_t a) { unsigned long b; return __riscv_vmsne_vx_u64m4_b16 (a, b, get_vl ()); // ICE } #endif This is comes from the below parts: !(targetm.class_likely_spilled_p (REGNO_REG_CLASS (ret_start))); For RVV, the reg_class values are listed as below. Because the Vector Mask has only one reg, then it will be considered as likely spilled as the hook TARGET_CLASS_LIKELY_SPILLED_P default returns true if reg_class_size[class] == 1. Not very sure if overriding TARGET_CLASS_LIKELY_SPILLED_P hook for riscv is a reasonable fix, trying to understand TARGET_CLASS_LIKELY_SPILLED_P... --------panli-----reg_class_size[0]=0 --------panli-----reg_class_size[1]=14 --------panli-----reg_class_size[2]=26 --------panli-----reg_class_size[3]=32 --------panli-----reg_class_size[4]=32 --------panli-----reg_class_size[5]=2 --------panli-----reg_class_size[6]=1 <= VM --------panli-----reg_class_size[7]=31 <= VD --------panli-----reg_class_size[8]=32 <= V --------panli-----reg_class_size[9]=98