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_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<fixed_size_mode> (mode, &candidate)
+ && GET_MODE_SIZE (candidate) > UNITS_PER_WORD
&& GET_MODE_INNER (candidate) == QImode)
{
if (GET_MODE_SIZE (candidate) >= size)
} while (k);
}
-/* { dg-final { scan-assembler-times {vsetivli\tzero,\s*4,\s*e8,\s*mf4,\s*t[au],\s*m[au]} 1 } } */
/* { dg-final { scan-assembler-times {vsetivli\tzero,\s*8,\s*e8,\s*mf2,\s*t[au],\s*m[au]} 1 } } */
--- /dev/null
+/* Test that we do not use QI vector to initilize the memory if the
+ * size of QI vector isn't larger than UNITS_PER_WORD */
+/* { dg-do compile } */
+/* { dg-options "-march=rv32gcv -mabi=ilp32 -O3" } */
+
+struct s {
+ int a;
+ int b : 1;
+};
+
+void q(struct s*);
+
+void g() {
+ struct s r = { 15, 0 };
+ q(&r);
+}
+
+/* { dg-final { scan-assembler-times {sw\tzero,12\(sp\)} 1 } } */