> 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. OK, thanks! We have other builtins that may fold into string function which we expand internally (str variants comes to mind) perhaps they could be instrumented, too.
Honza > > 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))) >