]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Prefer scalar_int_mode if the size - 1 is equal to UNITS_PER_WORD.
authorTsung Chun Lin <tclin914@gmail.com>
Tue, 7 Jan 2025 21:48:31 +0000 (14:48 -0700)
committerJeff Law <jlaw@ventanamicro.com>
Tue, 7 Jan 2025 21:48:31 +0000 (14:48 -0700)
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
gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113469.c
gcc/testsuite/gcc.target/riscv/rvv/base/movqi-1.c [new file with mode: 0644]

index 635bb9efa9ebf68290b451869968ff1d10529ac9..235e79546113df689b554ae9d39ba780f26c45c5 100644 (file)
@@ -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<fixed_size_mode> (mode, &candidate)
+           && GET_MODE_SIZE (candidate) > UNITS_PER_WORD
            && GET_MODE_INNER (candidate) == QImode)
          {
            if (GET_MODE_SIZE (candidate) >= size)
index 52e2580c53e67cc49002eae0fffb5fe67cf1e794..6549ae61c672e35131f3ab3eaf2fd6774b355e66 100644 (file)
@@ -51,5 +51,4 @@ void p(int buf, __builtin_va_list ab, int q) {
  } 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 } } */
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/movqi-1.c b/gcc/testsuite/gcc.target/riscv/rvv/base/movqi-1.c
new file mode 100644 (file)
index 0000000..bc46103
--- /dev/null
@@ -0,0 +1,18 @@
+/* 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 } } */