Tsung Chun Lin <tclin...@gmail.com> writes: > Address Richard's comment. > > Thanks > Jim > > Richard Sandiford <richard.sandif...@arm.com> 於 2024年12月30日 週一 下午7:50寫道: >> >> Tsung Chun Lin <tclin...@gmail.com> writes: >> > From ddb7852c92dc0222af9eeec1deafce753b3a7067 Mon Sep 17 00:00:00 2001 >> > From: Jim Tsung-Chun Lin <j...@andestech.com> >> > Date: Mon, 30 Dec 2024 15:32:12 +0800 >> > Subject: [PATCH] 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. >> >> That makes sense, but... >> >> > 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 | 2 +- >> > gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113469.c | 1 - >> > 2 files changed, 1 insertion(+), 2 deletions(-) >> > >> > diff --git a/gcc/expr.cc b/gcc/expr.cc >> > index babf00f34dc..e2abef1f544 100644 >> > --- a/gcc/expr.cc >> > +++ b/gcc/expr.cc >> > @@ -1062,7 +1062,7 @@ 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) && (size - 1) > UNITS_PER_WORD) >> >> ...it looks like this will still use UNITS_PER_WORD QI vectors for >> size == UNITS_PER_WORD + 2. >> >> How about instead removing the size > UNITS_PER_WORD check above and >> instead checking: >> >> if (is_a<fixed_size_mode> (mode, &candidate) >> && GET_MODE_SIZE (candidate) > UNITS_PER_WORD >> && GET_MODE_INNER (candidate) == QImode) >> >> in the loop (with the second line being new)? >> >> Thanks, >> Richard >> >> > { >> > machine_mode mode; >> > fixed_size_mode candidate; >> > diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113469.c >> > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113469.c >> > index 52e2580c53e..6549ae61c67 100644 >> > --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113469.c >> > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113469.c >> > @@ -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 } } */ > > From 6dce42681ace1282d3201e906187697dcff8e9b1 Mon Sep 17 00:00:00 2001 > From: Jim Tsung-Chun Lin <j...@andestech.com> > Date: Mon, 30 Dec 2024 15:32:12 +0800 > Subject: [PATCH] Prefer scalar_int_mode if the size of QI vector 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 | 3 ++- > gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113469.c | 1 - > 2 files changed, 2 insertions(+), 2 deletions(-)
Thanks, the expr.cc change looks good to me. I'd like sign-off from a RISC-V maintainer on the testsuite changes before pushing to trunk though. Richard > > diff --git a/gcc/expr.cc b/gcc/expr.cc > index babf00f34dc..422e2b2ebc9 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<fixed_size_mode> (mode, &candidate) > + && GET_MODE_SIZE (candidate) > UNITS_PER_WORD > && GET_MODE_INNER (candidate) == QImode) > { > if (GET_MODE_SIZE (candidate) >= size) > diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113469.c > b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113469.c > index 52e2580c53e..6549ae61c67 100644 > --- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113469.c > +++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113469.c > @@ -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 } } */