]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
bpf: Forces __buildin_memcmp not to generate a call upto 1024 bytes.
authorCupertino Miranda <cupertino.miranda@oracle.com>
Fri, 10 Nov 2023 16:42:13 +0000 (16:42 +0000)
committerCupertino Miranda <cupertino.miranda@oracle.com>
Tue, 28 Nov 2023 12:46:16 +0000 (12:46 +0000)
This patch forces __builtin_memcmp calls upto data sizes of 1024 to
become inline in caller.
This is a requirement by BPF and it mimics the default behaviour of the
clang BPF implementation.

gcc/ChangeLog:
* config/bpf/bpf.cc (bpf_use_by_pieces_infrastructure_p): Added
function to bypass default behaviour.
* config/bpf/bpf.h (COMPARE_MAX_PIECES): Defined to 1024 bytes.

gcc/config/bpf/bpf.cc
gcc/config/bpf/bpf.h

index 223a43cbbb3d3cea8d0bb2657eff25a82549b797..4bfba289546cac9b208e37ea32337ac4a55382d9 100644 (file)
@@ -1117,6 +1117,22 @@ bpf_small_register_classes_for_mode_p (machine_mode mode)
 #define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P \
   bpf_small_register_classes_for_mode_p
 
+static bool
+bpf_use_by_pieces_infrastructure_p (unsigned HOST_WIDE_INT size,
+                                   unsigned int align ATTRIBUTE_UNUSED,
+                                   enum by_pieces_operation op,
+                                   bool speed_p)
+{
+  if (op != COMPARE_BY_PIECES)
+    return default_use_by_pieces_infrastructure_p (size, align, op, speed_p);
+
+  return size <= COMPARE_MAX_PIECES;
+}
+
+#undef TARGET_USE_BY_PIECES_INFRASTRUCTURE_P
+#define TARGET_USE_BY_PIECES_INFRASTRUCTURE_P \
+  bpf_use_by_pieces_infrastructure_p
+
 /* Finally, build the GCC target.  */
 
 struct gcc_target targetm = TARGET_INITIALIZER;
index 82702aa7b6ba1b92a3903af3e2c21a3c1b6fe201..1f177ec4c4efccd9913e561e2d1f70b21dc7199d 100644 (file)
@@ -489,6 +489,11 @@ enum reg_class
    locations.  */
 #define MOVE_MAX 8
 
+/* Allow upto 1024 bytes moves to occur using by_pieces
+   infrastructure.  This mimics clang behaviour when using
+   __builtin_memcmp.  */
+#define COMPARE_MAX_PIECES 1024
+
 /* An alias for the machine mode for pointers.  */
 #define Pmode DImode