Hi.

As requested in the PR, I would like to add value profiling for
BUILT_IN_MEMMOVE.
Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed?
Martin

gcc/ChangeLog:

2018-07-31  Martin Liska  <mli...@suse.cz>

        PR value-prof/35543
        * value-prof.c (interesting_stringop_to_profile_p):
        Simplify the code and add BUILT_IN_MEMMOVE.
        (gimple_stringops_transform): Likewise.

gcc/testsuite/ChangeLog:

2018-07-31  Martin Liska  <mli...@suse.cz>

        PR value-prof/35543
        * gcc.dg/tree-prof/val-prof-7.c: Add __builtin_memmove.
---
 gcc/testsuite/gcc.dg/tree-prof/val-prof-7.c | 10 ++++++++++
 gcc/value-prof.c                            |  8 +++-----
 2 files changed, 13 insertions(+), 5 deletions(-)


diff --git a/gcc/testsuite/gcc.dg/tree-prof/val-prof-7.c b/gcc/testsuite/gcc.dg/tree-prof/val-prof-7.c
index c9303e053ee..bb9dd210eec 100644
--- a/gcc/testsuite/gcc.dg/tree-prof/val-prof-7.c
+++ b/gcc/testsuite/gcc.dg/tree-prof/val-prof-7.c
@@ -23,6 +23,11 @@ __attribute__((noinline)) \
 void memset_test_ ## N (int len) \
 { \
   __builtin_memset (buffer1, 'c', len); \
+} \
+__attribute__((noinline)) \
+void memmove_test_ ## N (int len) \
+{ \
+  __builtin_memmove (buffer1, buffer2, len); \
 } \
  \
 void test_stringops_ ## N(int len) \
@@ -30,6 +35,7 @@ void test_stringops_ ## N(int len) \
   memcpy_test_## N (len); \
   mempcpy_test_ ## N (len); \
   memset_test_ ## N (len); \
+  memmove_test_ ## N (len); \
 } \
  \
 void test_stringops_with_values_ ## N (int common, int not_common) \
@@ -70,3 +76,7 @@ int main() {
 /* { dg-final-use-not-autofdo { scan-ipa-dump "Single value 8 stringop transformation on __builtin_memset" "profile" } } */
 /* { dg-final-use-not-autofdo { scan-ipa-dump "Single value 55 stringop transformation on __builtin_memset" "profile" } } */
 /* { dg-final-use-not-autofdo { scan-ipa-dump-times "Single value 32 stringop transformation on __builtin_memset" 0 "profile" } } */
+
+/* { dg-final-use-not-autofdo { scan-ipa-dump "Single value 8 stringop transformation on __builtin_memmove" "profile" } } */
+/* { dg-final-use-not-autofdo { scan-ipa-dump "Single value 55 stringop transformation on __builtin_memmove" "profile" } } */
+/* { dg-final-use-not-autofdo { scan-ipa-dump-times "Single value 32 stringop transformation on __builtin_memmove" 0 "profile" } } */
diff --git a/gcc/value-prof.c b/gcc/value-prof.c
index 77d4849d5b1..a7c4be7a7d8 100644
--- a/gcc/value-prof.c
+++ b/gcc/value-prof.c
@@ -1527,14 +1527,11 @@ interesting_stringop_to_profile_p (gcall *call, int *size_arg)
   enum built_in_function fcode;
 
   fcode = DECL_FUNCTION_CODE (gimple_call_fndecl (call));
-  if (fcode != BUILT_IN_MEMCPY && fcode != BUILT_IN_MEMPCPY
-      && fcode != BUILT_IN_MEMSET && fcode != BUILT_IN_BZERO)
-    return false;
-
   switch (fcode)
     {
      case BUILT_IN_MEMCPY:
      case BUILT_IN_MEMPCPY:
+     case BUILT_IN_MEMMOVE:
        *size_arg = 2;
        return validate_gimple_arglist (call, POINTER_TYPE, POINTER_TYPE,
 				       INTEGER_TYPE, VOID_TYPE);
@@ -1547,7 +1544,7 @@ interesting_stringop_to_profile_p (gcall *call, int *size_arg)
        return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
 				       VOID_TYPE);
      default:
-       gcc_unreachable ();
+       return false;
     }
 }
 
@@ -1710,6 +1707,7 @@ gimple_stringops_transform (gimple_stmt_iterator *gsi)
     {
     case BUILT_IN_MEMCPY:
     case BUILT_IN_MEMPCPY:
+    case BUILT_IN_MEMMOVE:
       src = gimple_call_arg (stmt, 1);
       src_align = get_pointer_alignment (src);
       if (!can_move_by_pieces (val, MIN (dest_align, src_align)))

Reply via email to