Add memmove to value profiling.
authorMartin Liska <mliska@suse.cz>
Wed, 1 Aug 2018 10:21:49 +0000 (12:21 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Wed, 1 Aug 2018 10:21:49 +0000 (10:21 +0000)
2018-08-01  Martin Liska  <mliska@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.
2018-08-01  Martin Liska  <mliska@suse.cz>

        PR value-prof/35543
* gcc.dg/tree-prof/val-prof-7.c: Add __builtin_memmove.

From-SVN: r263201

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-prof/val-prof-7.c
gcc/value-prof.c

index b8152e34c66e8292e2bc5172e4d160becf4661ad..a4cb45144c9fbc712d34afd504e0165be29467e9 100644 (file)
@@ -1,3 +1,10 @@
+2018-08-01  Martin Liska  <mliska@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.
+
 2018-08-01  Sam Tebbs  <sam.tebbs@arm.com>
 
        * config/aarch64/aarch64-simd.md
index f9448b94666cccda68f5e9d2936b3ecf50d38d43..00af769b225f912257dc876bc7eff0206bb931e1 100644 (file)
@@ -1,3 +1,8 @@
+2018-08-01  Martin Liska  <mliska@suse.cz>
+
+        PR value-prof/35543
+       * gcc.dg/tree-prof/val-prof-7.c: Add __builtin_memmove.
+
 2018-08-01  Sam Tebbs  <sam.tebbs@arm.com>
 
        * gcc.target/aarch64/extract_zero_extend.c: New file.
index c9303e053eeb6bcc165f87c0dd6a9acd7bc4a50c..bb9dd210eece22c38dd72b24ea1526eb8cb33038 100644 (file)
@@ -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" } } */
index 77d4849d5b1047a39390fdb93e06ee184fc7423e..a7c4be7a7d8421a705f6117794e2c30338e71305 100644 (file)
@@ -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)))