From d953c2c5714ed8503c4ae1b7d059a62e4e9a0624 Mon Sep 17 00:00:00 2001 From: Tsung Chun Lin Date: Tue, 7 Jan 2025 14:48:31 -0700 Subject: Prefer scalar_int_mode if the size - 1 is equal to UNITS_PER_WORD. Don't use the QI vector if its size is equal to UNITS_PER_WORD for better code generation. Before patch: vsetivli zero,4,e8,mf4,ta,ma vmv.v.i v1,0 addi a4,sp,12 vse8.v v1,0(a4) After patch: sw zero,12(sp) gcc/ * expr.cc (widest_fixed_size_mode_for_size): Prefer scalar modes over vector modes in more cases. gcc/testsuite/ * gcc.target/riscv/rvv/autovec/pr113469.c: Update expected output. * gcc.target/riscv/rvv/base/movqi-1.c: New test. --- gcc/expr.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'gcc/expr.cc') diff --git a/gcc/expr.cc b/gcc/expr.cc index 635bb9e..235e795 100644 --- a/gcc/expr.cc +++ b/gcc/expr.cc @@ -1062,12 +1062,13 @@ widest_fixed_size_mode_for_size (unsigned int size, by_pieces_operation op) gcc_checking_assert (size > 1); /* Use QI vector only if size is wider than a WORD. */ - if (can_use_qi_vectors (op) && size > UNITS_PER_WORD) + if (can_use_qi_vectors (op)) { machine_mode mode; fixed_size_mode candidate; FOR_EACH_MODE_IN_CLASS (mode, MODE_VECTOR_INT) if (is_a (mode, &candidate) + && GET_MODE_SIZE (candidate) > UNITS_PER_WORD && GET_MODE_INNER (candidate) == QImode) { if (GET_MODE_SIZE (candidate) >= size) -- cgit v1.1