public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH] MIPS: don't expand large block move
@ 2023-05-19  6:11 YunQiang Su
  2023-05-19 16:56 ` Jeff Law
  0 siblings, 1 reply; 5+ messages in thread
From: YunQiang Su @ 2023-05-19  6:11 UTC (permalink / raw)
  To: gcc-patches; +Cc: macro, jiaxun.yang, syq, richard.sandiford, YunQiang Su

On platform with LWL/LWR, mips_block_move_loop is always used,
which expand __buildin_memcpy/strcpy to a loop of lwl/lwr/swl/swl etc.

For short (normally <=64), it has better performance,
but when the src/dest are long, use memcpy/strcpy lib call may have
better performance.

At the same time, lib call may be optimized with SIMD, so,
on the platform with SIMD, lib call may have much better performace.

gcc/ChangeLog:
	* config/mips/mips.cc (mips_expand_block_move): don't expand
	  if length>=64.

gcc/testsuite/ChangeLog:
	* gcc.target/mips/expand-block-move-large.c: New test.
---
 gcc/config/mips/mips.cc                         |  6 ++++++
 .../gcc.target/mips/expand-block-move-large.c   | 17 +++++++++++++++++
 2 files changed, 23 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/mips/expand-block-move-large.c

diff --git a/gcc/config/mips/mips.cc b/gcc/config/mips/mips.cc
index ca491b981a3..00f26d5e923 100644
--- a/gcc/config/mips/mips.cc
+++ b/gcc/config/mips/mips.cc
@@ -8313,6 +8313,12 @@ mips_expand_block_move (rtx dest, rtx src, rtx length)
 	}
       else if (optimize)
 	{
+	  /* When the length is big enough, the lib call has better performace
+	     than load/store insns.
+	     In most platform, the value is about 64-128.
+	     And in fact lib call may be optimized with SIMD */
+	  if (INTVAL(length) >= 64)
+	    return false;
 	  mips_block_move_loop (dest, src, INTVAL (length),
 				MIPS_MAX_MOVE_BYTES_PER_LOOP_ITER);
 	  return true;
diff --git a/gcc/testsuite/gcc.target/mips/expand-block-move-large.c b/gcc/testsuite/gcc.target/mips/expand-block-move-large.c
new file mode 100644
index 00000000000..ae054551a2a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/mips/expand-block-move-large.c
@@ -0,0 +1,17 @@
+/* { dg-options "isa_rev<=5" } */
+/* { dg-final { scan-assembler-not "lwl" } } */
+/* { dg-final { scan-assembler-not "swl" } } */
+/* { dg-final { scan-assembler-not "lwr" } } */
+/* { dg-final { scan-assembler-not "swr" } } */
+/* { dg-final { scan-assembler-not "ldl" } } */
+/* { dg-final { scan-assembler-not "sdl" } } */
+/* { dg-final { scan-assembler-not "ldr" } } */
+/* { dg-final { scan-assembler-not "sdr" } } */
+
+char a[4097], b[4097];
+
+NOCOMPRESSION void
+foo (volatile int *x)
+{
+  __builtin_memcpy(&a[1], &b[1], 64);
+}
-- 
2.30.2


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2023-05-30 11:44 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-05-19  6:11 [PATCH] MIPS: don't expand large block move YunQiang Su
2023-05-19 16:56 ` Jeff Law
2023-05-19 19:21   ` Maciej W. Rozycki
2023-05-24  2:04     ` YunQiang Su
2023-05-30 11:44       ` Maciej W. Rozycki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).