https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115795
--- Comment #8 from Jordi Sala <jordi.sala at semidynamics dot com> --- (In reply to JuzheZhong from comment #7) > (In reply to Jordi Sala from comment #6) > > Perfect, that's what I was looking for. I'm thinking of adding a way to tell > > GCC to minimize, maximize or preserve SEW on vsetvl expand. Like > > -mrvv-vsetvl-sew={maximize,minimize,preserve} > > No. I don't think you need to add an option here. > > I think you should change the default according to the vsetvl intrinsic > builtin > sematic. For example, set SEW/LMUL as e32m2 if it is __riscv_vsetvl_e32m2, or > set it as e64m1 if it is __riscv_vsetvl_e64m1 which will make codegen more > straightforward. > > > if (TARGET_XTHEADVECTOR) > { > machine_mode inner_mode = GET_MODE_INNER (mode); > /* SEW. */ > e.add_input_operand (Pmode, > gen_int_mode (GET_MODE_BITSIZE (inner_mode), Pmode)); > /* LMUL. */ > e.add_input_operand (Pmode, > gen_int_mode (get_vlmul (mode), Pmode)); > } > else > { > /* Normalize same RATO (SEW/LMUL) into same vsetvl instruction. > > - e8,mf8/e16,mf4/e32,mf2/e64,m1 --> e8mf8 > - e8,mf4/e16,mf2/e32,m1/e64,m2 --> e8mf4 > - e8,mf2/e16,m1/e32,m2/e64,m4 --> e8mf2 > - e8,m1/e16,m2/e32,m4/e64,m8 --> e8m1 > - e8,m2/e16,m4/e32,m8 --> e8m2 > - e8,m4/e16,m8 --> e8m4 > - e8,m8 --> e8m8 > */ > /* SEW. */ > e.add_input_operand (Pmode, gen_int_mode (8, Pmode)); > > /* LMUL. */ > machine_mode e8_mode > = get_vector_mode (QImode, GET_MODE_NUNITS (mode)).require (); > e.add_input_operand (Pmode, gen_int_mode (get_vlmul (e8_mode), Pmode)); > } > > into: > > machine_mode inner_mode = GET_MODE_INNER (mode); > /* SEW. */ > e.add_input_operand (Pmode, > gen_int_mode (GET_MODE_BITSIZE (inner_mode), Pmode)); > /* LMUL. */ > e.add_input_operand (Pmode, > gen_int_mode (get_vlmul (mode), Pmode)); I'm closing the issue as this looks to me the best way to fix it. Thanks for all the support.