]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
rs6000: Enable overlapped by-pieces operations
authorHaochen Gui <guihaoc@gcc.gnu.org>
Tue, 14 May 2024 08:37:06 +0000 (16:37 +0800)
committerHaochen Gui <guihaoc@gcc.gnu.org>
Tue, 14 May 2024 08:37:40 +0000 (16:37 +0800)
This patch enables overlapped by-piece operations by defining
TARGET_OVERLAP_OP_BY_PIECES_P to true.  On rs6000, default move/set/clear
ratio is 2.  So the overlap is only enabled with compare by-pieces.

gcc/
* config/rs6000/rs6000.cc (TARGET_OVERLAP_OP_BY_PIECES_P): Define.

gcc/testsuite/
* gcc.target/powerpc/block-cmp-9.c: New.

gcc/config/rs6000/rs6000.cc
gcc/testsuite/gcc.target/powerpc/block-cmp-9.c [new file with mode: 0644]

index 117999613d835333b898f722e62e83530aea8b43..e713a1e1d570aee467348e59a0647521c15e1b6c 100644 (file)
@@ -1776,6 +1776,9 @@ static const scoped_attribute_specs *const rs6000_attribute_table[] =
 #undef TARGET_CONST_ANCHOR
 #define TARGET_CONST_ANCHOR 0x8000
 
+#undef TARGET_OVERLAP_OP_BY_PIECES_P
+#define TARGET_OVERLAP_OP_BY_PIECES_P hook_bool_void_true
+
 \f
 
 /* Processor table.  */
diff --git a/gcc/testsuite/gcc.target/powerpc/block-cmp-9.c b/gcc/testsuite/gcc.target/powerpc/block-cmp-9.c
new file mode 100644 (file)
index 0000000..f16429c
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-not {\ml[hb]z\M} } } */
+
+/* Test if by-piece overlap compare is enabled and following case is
+   implemented by two overlap word loads and compares.  */
+
+int foo (const char* s1, const char* s2)
+{
+  return __builtin_memcmp (s1, s2, 7) == 0;
+}