+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
+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.
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) \
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) \
/* { 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" } } */
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);
return validate_gimple_arglist (call, POINTER_TYPE, INTEGER_TYPE,
VOID_TYPE);
default:
- gcc_unreachable ();
+ return false;
}
}
{
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)))