diff mbox series

[1/2] RISC-V: Add tests for cpymemsi expansion

Message ID 20240508055217.2038902-1-christoph.muellner@vrull.eu
State New
Headers show
Series [1/2] RISC-V: Add tests for cpymemsi expansion | expand

Commit Message

Christoph Müllner May 8, 2024, 5:52 a.m. UTC
cpymemsi expansion was available for RISC-V since the initial port.
However, there are not tests to detect regression.
This patch adds such tests.

Three of the tests target the expansion requirements (known length and
alignment). One test reuses an existing memcpy test from the by-pieces
framework (gcc/testsuite/gcc.dg/torture/inline-mem-cpy-1.c).

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/cpymemsi-1.c: New test.
	* gcc.target/riscv/cpymemsi-2.c: New test.
	* gcc.target/riscv/cpymemsi-3.c: New test.
	* gcc.target/riscv/cpymemsi.c: New test.

Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu>
---
 gcc/testsuite/gcc.target/riscv/cpymemsi-1.c |  9 +++++
 gcc/testsuite/gcc.target/riscv/cpymemsi-2.c | 42 ++++++++++++++++++++
 gcc/testsuite/gcc.target/riscv/cpymemsi-3.c | 43 +++++++++++++++++++++
 gcc/testsuite/gcc.target/riscv/cpymemsi.c   | 22 +++++++++++
 4 files changed, 116 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpymemsi-1.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpymemsi-2.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpymemsi-3.c
 create mode 100644 gcc/testsuite/gcc.target/riscv/cpymemsi.c

Comments

Jeff Law May 8, 2024, 10:21 p.m. UTC | #1
On 5/7/24 11:52 PM, Christoph Müllner wrote:
> cpymemsi expansion was available for RISC-V since the initial port.
> However, there are not tests to detect regression.
> This patch adds such tests.
> 
> Three of the tests target the expansion requirements (known length and
> alignment). One test reuses an existing memcpy test from the by-pieces
> framework (gcc/testsuite/gcc.dg/torture/inline-mem-cpy-1.c).
> 
> gcc/testsuite/ChangeLog:
> 
> 	* gcc.target/riscv/cpymemsi-1.c: New test.
> 	* gcc.target/riscv/cpymemsi-2.c: New test.
> 	* gcc.target/riscv/cpymemsi-3.c: New test.
> 	* gcc.target/riscv/cpymemsi.c: New test.
OK
jeff
Patrick O'Neill May 10, 2024, 4:01 a.m. UTC | #2
Hi Christoph,

cpymemsi-1.c fails on a subset of newlib targets.

"UNRESOLVED: gcc.target/riscv/cpymemsi-1.c   -O0  compilation failed to 
produce executable"

Full list of failing targets here (New Failures section): 
https://github.com/patrick-rivos/gcc-postcommit-ci/issues/906

Thanks,

Patrick

On 5/7/24 22:52, Christoph Müllner wrote:
> cpymemsi expansion was available for RISC-V since the initial port.
> However, there are not tests to detect regression.
> This patch adds such tests.
>
> Three of the tests target the expansion requirements (known length and
> alignment). One test reuses an existing memcpy test from the by-pieces
> framework (gcc/testsuite/gcc.dg/torture/inline-mem-cpy-1.c).
>
> gcc/testsuite/ChangeLog:
>
> 	* gcc.target/riscv/cpymemsi-1.c: New test.
> 	* gcc.target/riscv/cpymemsi-2.c: New test.
> 	* gcc.target/riscv/cpymemsi-3.c: New test.
> 	* gcc.target/riscv/cpymemsi.c: New test.
>
> Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu>
> ---
Christoph Müllner May 15, 2024, 5 a.m. UTC | #3
On Fri, May 10, 2024 at 6:01 AM Patrick O'Neill <patrick@rivosinc.com> wrote:
>
> Hi Christoph,
>
> cpymemsi-1.c fails on a subset of newlib targets.
>
> "UNRESOLVED: gcc.target/riscv/cpymemsi-1.c   -O0  compilation failed to
> produce executable"
>
> Full list of failing targets here (New Failures section):
> https://github.com/patrick-rivos/gcc-postcommit-ci/issues/906

Thanks for reporting!
I'm having a hard time figuring out what the issue is here, as I can't
reproduce it locally.
This test is an execution test ("dg-do run"), so I wonder if this
might be the issue?

Thanks,
Christoph

>
> Thanks,
>
> Patrick
>
> On 5/7/24 22:52, Christoph Müllner wrote:
> > cpymemsi expansion was available for RISC-V since the initial port.
> > However, there are not tests to detect regression.
> > This patch adds such tests.
> >
> > Three of the tests target the expansion requirements (known length and
> > alignment). One test reuses an existing memcpy test from the by-pieces
> > framework (gcc/testsuite/gcc.dg/torture/inline-mem-cpy-1.c).
> >
> > gcc/testsuite/ChangeLog:
> >
> >       * gcc.target/riscv/cpymemsi-1.c: New test.
> >       * gcc.target/riscv/cpymemsi-2.c: New test.
> >       * gcc.target/riscv/cpymemsi-3.c: New test.
> >       * gcc.target/riscv/cpymemsi.c: New test.
> >
> > Signed-off-by: Christoph Müllner <christoph.muellner@vrull.eu>
> > ---
Patrick O'Neill May 15, 2024, 8:22 p.m. UTC | #4
On 5/14/24 22:00, Christoph Müllner wrote:
> On Fri, May 10, 2024 at 6:01 AM Patrick O'Neill<patrick@rivosinc.com>  wrote:
>> Hi Christoph,
>>
>> cpymemsi-1.c fails on a subset of newlib targets.
>>
>> "UNRESOLVED: gcc.target/riscv/cpymemsi-1.c   -O0  compilation failed to
>> produce executable"
>>
>> Full list of failing targets here (New Failures section):
>> https://github.com/patrick-rivos/gcc-postcommit-ci/issues/906
> Thanks for reporting!
> I'm having a hard time figuring out what the issue is here, as I can't
> reproduce it locally.
> This test is an execution test ("dg-do run"), so I wonder if this
> might be the issue?

riscv-gnu-toolchain configure command: ../configure --prefix=$(pwd) 
-with-arch=rv32imac_zba_zbb_zbc_zbs -with-abi=ilp32

Here's the verbose logs:

Executing on host: /scratch/tc-testing/tc-upstream/build/build-gcc-newlib-stage2/gcc/xgcc -B/scratch/tc-testing/tc-upstream/build/build-gcc-newlib-stage2/gcc/  /scratch/tc-testing/tc-upstream/gcc/gcc/testsuite/gcc.target/riscv/cpymemsi-1.c  -march=rv32imac_zba_zbb_zbc_zbs -mabi=ilp32 -mcmodel=medlow   -fdiagnostics-plain-output    -O0  -march=rv32gc -save-temps -g0 -fno-lto -DRUN_FRACTION=11      -lm  -o ./cpymemsi-1.exe    (timeout = 1200)
spawn -ignore SIGHUP /scratch/tc-testing/tc-upstream/build/build-gcc-newlib-stage2/gcc/xgcc -B/scratch/tc-testing/tc-upstream/build/build-gcc-newlib-stage2/gcc/ /scratch/tc-testing/tc-upstream/gcc/gcc/testsuite/gcc.target/riscv/cpymemsi-1.c -march=rv32imac_zba_zbb_zbc_zbs -mabi=ilp32 -mcmodel=medlow -fdiagnostics-plain-output -O0 -march=rv32gc -save-temps -g0 -fno-lto -DRUN_FRACTION=11 -lm -o ./cpymemsi-1.exe
xgcc: fatal error: Cannot find suitable multilib set for '-march=rv32imafdc_zicsr_zifencei'/'-mabi=ilp32'
compilation terminated.
compiler exited with status 1
FAIL: gcc.target/riscv/cpymemsi-1.c   -O0  (test for excess errors)

Looks like it's only failing on targets without the 'f' extension so 
maybe we need to add a riscv_f to avoid running on non-f targets 
(similar to what we have for riscv_v)?

Patrick
Christoph Müllner May 16, 2024, 8:02 a.m. UTC | #5
On Wed, May 15, 2024 at 10:22 PM Patrick O'Neill <patrick@rivosinc.com> wrote:
>
>
> On 5/14/24 22:00, Christoph Müllner wrote:
>
> On Fri, May 10, 2024 at 6:01 AM Patrick O'Neill <patrick@rivosinc.com> wrote:
>
> Hi Christoph,
>
> cpymemsi-1.c fails on a subset of newlib targets.
>
> "UNRESOLVED: gcc.target/riscv/cpymemsi-1.c   -O0  compilation failed to
> produce executable"
>
> Full list of failing targets here (New Failures section):
> https://github.com/patrick-rivos/gcc-postcommit-ci/issues/906
>
> Thanks for reporting!
> I'm having a hard time figuring out what the issue is here, as I can't
> reproduce it locally.
> This test is an execution test ("dg-do run"), so I wonder if this
> might be the issue?
>
> riscv-gnu-toolchain configure command: ../configure --prefix=$(pwd) -with-arch=rv32imac_zba_zbb_zbc_zbs -with-abi=ilp32
>
> Here's the verbose logs:
>
> Executing on host: /scratch/tc-testing/tc-upstream/build/build-gcc-newlib-stage2/gcc/xgcc -B/scratch/tc-testing/tc-upstream/build/build-gcc-newlib-stage2/gcc/  /scratch/tc-testing/tc-upstream/gcc/gcc/testsuite/gcc.target/riscv/cpymemsi-1.c  -march=rv32imac_zba_zbb_zbc_zbs -mabi=ilp32 -mcmodel=medlow   -fdiagnostics-plain-output    -O0  -march=rv32gc -save-temps -g0 -fno-lto -DRUN_FRACTION=11      -lm  -o ./cpymemsi-1.exe    (timeout = 1200)
> spawn -ignore SIGHUP /scratch/tc-testing/tc-upstream/build/build-gcc-newlib-stage2/gcc/xgcc -B/scratch/tc-testing/tc-upstream/build/build-gcc-newlib-stage2/gcc/ /scratch/tc-testing/tc-upstream/gcc/gcc/testsuite/gcc.target/riscv/cpymemsi-1.c -march=rv32imac_zba_zbb_zbc_zbs -mabi=ilp32 -mcmodel=medlow -fdiagnostics-plain-output -O0 -march=rv32gc -save-temps -g0 -fno-lto -DRUN_FRACTION=11 -lm -o ./cpymemsi-1.exe
> xgcc: fatal error: Cannot find suitable multilib set for '-march=rv32imafdc_zicsr_zifencei'/'-mabi=ilp32'
> compilation terminated.
> compiler exited with status 1
> FAIL: gcc.target/riscv/cpymemsi-1.c   -O0  (test for excess errors)
>
> Looks like it's only failing on targets without the 'f' extension so maybe we need to add a riscv_f to avoid running on non-f targets (similar to what we have for riscv_v)?

Ok, now I understand what's going on.
For "dg-do run" tests we should be more liberal with the provided
`-march` string in dg-options
(or be more restrictive using effective-target checks if necessary -
which is not the case here).
I've sent out the following patch, which should address this issue:
  https://gcc.gnu.org/pipermail/gcc-patches/2024-May/651841.html

BR
Christoph
diff mbox series

Patch

diff --git a/gcc/testsuite/gcc.target/riscv/cpymemsi-1.c b/gcc/testsuite/gcc.target/riscv/cpymemsi-1.c
new file mode 100644
index 00000000000..983b564ccaf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpymemsi-1.c
@@ -0,0 +1,9 @@ 
+/* { dg-do run } */
+/* { dg-options "-march=rv32gc -save-temps -g0 -fno-lto" { target { rv32 } } } */
+/* { dg-options "-march=rv64gc -save-temps -g0 -fno-lto" { target { rv64 } } } */
+/* { dg-additional-options "-DRUN_FRACTION=11" { target simulator } } */
+/* { dg-timeout-factor 2 } */
+
+#include "../../gcc.dg/memcmp-1.c"
+/* Yeah, this memcmp test exercises plenty of memcpy, more than any of the
+   memcpy tests.  */
diff --git a/gcc/testsuite/gcc.target/riscv/cpymemsi-2.c b/gcc/testsuite/gcc.target/riscv/cpymemsi-2.c
new file mode 100644
index 00000000000..833d1c04487
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpymemsi-2.c
@@ -0,0 +1,42 @@ 
+/* { dg-do compile } */
+/* { dg-options "-march=rv32gc" { target { rv32 } } } */
+/* { dg-options "-march=rv64gc" { target { rv64 } } } */
+/* { dg-skip-if "" { *-*-* } { "-O0" "-Os" "-Og" "-Oz" } } */
+
+#include <stddef.h>
+#define aligned32 __attribute__ ((aligned (32)))
+
+const char myconst15[] aligned32 = { 1, 2, 3, 4, 5, 6, 7,
+				     0, 1, 2, 3, 4, 5, 6, 7 };
+const char myconst23[] aligned32 = { 1, 2, 3, 4, 5, 6, 7,
+				     0, 1, 2, 3, 4, 5, 6, 7,
+				     0, 1, 2, 3, 4, 5, 6, 7 };
+const char myconst31[] aligned32 = { 1, 2, 3, 4, 5, 6, 7,
+				     0, 1, 2, 3, 4, 5, 6, 7,
+				     0, 1, 2, 3, 4, 5, 6, 7,
+				     0, 1, 2, 3, 4, 5, 6, 7 };
+
+/* No expansion (unknown alignment) */
+#define MY_MEM_CPY_N(N)					\
+void my_mem_cpy_##N (char *b1, const char *b2)		\
+{							\
+  __builtin_memcpy (b1, b2, N);				\
+}
+
+/* No expansion (unknown alignment) */
+#define MY_MEM_CPY_CONST_N(N)				\
+void my_mem_cpy_const_##N (char *b1)			\
+{							\
+  __builtin_memcpy (b1, myconst##N, sizeof(myconst##N));\
+}
+
+MY_MEM_CPY_N(15)
+MY_MEM_CPY_CONST_N(15)
+
+MY_MEM_CPY_N(23)
+MY_MEM_CPY_CONST_N(23)
+
+MY_MEM_CPY_N(31)
+MY_MEM_CPY_CONST_N(31)
+
+/* { dg-final { scan-assembler-times "\t(call|tail)\tmemcpy" 6 } } */
diff --git a/gcc/testsuite/gcc.target/riscv/cpymemsi-3.c b/gcc/testsuite/gcc.target/riscv/cpymemsi-3.c
new file mode 100644
index 00000000000..803765195b2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpymemsi-3.c
@@ -0,0 +1,43 @@ 
+/* { dg-do compile } */
+/* { dg-options "-march=rv32gc" { target { rv32 } } } */
+/* { dg-options "-march=rv64gc" { target { rv64 } } } */
+/* { dg-skip-if "" { *-*-* } { "-O0" "-Os" "-Og" "-Oz" } } */
+
+#include <stddef.h>
+#define aligned32 __attribute__ ((aligned (32)))
+
+const char myconst15[] aligned32 = { 1, 2, 3, 4, 5, 6, 7,
+				     0, 1, 2, 3, 4, 5, 6, 7 };
+const char myconst23[] aligned32 = { 1, 2, 3, 4, 5, 6, 7,
+				     0, 1, 2, 3, 4, 5, 6, 7,
+				     0, 1, 2, 3, 4, 5, 6, 7 };
+const char myconst31[] aligned32 = { 1, 2, 3, 4, 5, 6, 7,
+				     0, 1, 2, 3, 4, 5, 6, 7,
+				     0, 1, 2, 3, 4, 5, 6, 7,
+				     0, 1, 2, 3, 4, 5, 6, 7 };
+
+#define MY_MEM_CPY_ALIGNED_N(N)				\
+void my_mem_cpy_aligned_##N(char *b1, const char *b2)	\
+{							\
+  b1 = __builtin_assume_aligned (b1, 4096);		\
+  b2 = __builtin_assume_aligned (b2, 4096);		\
+  __builtin_memcpy (b1, b2, N);				\
+}
+
+#define MY_MEM_CPY_ALIGNED_CONST_N(N)			\
+void my_mem_cpy_aligned_const_##N(char *b1)		\
+{							\
+  b1 = __builtin_assume_aligned (b1, 4096);		\
+  __builtin_memcpy (b1, myconst##N, sizeof(myconst##N));	\
+}
+
+MY_MEM_CPY_ALIGNED_N(15)
+MY_MEM_CPY_ALIGNED_CONST_N(15)
+
+MY_MEM_CPY_ALIGNED_N(23)
+MY_MEM_CPY_ALIGNED_CONST_N(23)
+
+MY_MEM_CPY_ALIGNED_N(31)
+MY_MEM_CPY_ALIGNED_CONST_N(31)
+
+/* { dg-final { scan-assembler-not "\t(call|tail)\tmemcpy" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/cpymemsi.c b/gcc/testsuite/gcc.target/riscv/cpymemsi.c
new file mode 100644
index 00000000000..d27a488c8ed
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/cpymemsi.c
@@ -0,0 +1,22 @@ 
+/* { dg-do compile } */
+/* { dg-options "-march=rv32gc" { target { rv32 } } } */
+/* { dg-options "-march=rv64gc" { target { rv64 } } } */
+/* { dg-skip-if "" { *-*-* } { "-O0" "-Os" "-Og" "-Oz" } } */
+
+#include <stddef.h>
+
+/* No expansion (unknown size) */
+void my_mem_cpy_n(char *b1, const char *b2, size_t n)
+{
+  __builtin_memcpy (b1, b2, n);
+}
+
+/* No expansion (unknown size) */
+void my_mem_cpy_aligned(char *b1, const char *b2, size_t n)
+{
+  b1 = __builtin_assume_aligned (b1, 4096);
+  b2 = __builtin_assume_aligned (b2, 4096);
+  __builtin_memcpy (b1, b2, n);
+}
+
+/* { dg-final { scan-assembler-times "\t(call|tail)\tmemcpy" 2 } } */