Message ID | 20231113223723.11760-1-cupertino.miranda@oracle.com |
---|---|
State | New |
Headers | show |
Series | bpf: Forces __buildin_memcmp not to generate a call upto 1024 bytes. | expand |
Hi Cuper. Sorry, I missed this patch last week. This is OK. Thanks! > 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 | 16 ++++++++++++++++ > gcc/config/bpf/bpf.h | 5 +++++ > 2 files changed, 21 insertions(+) > > diff --git a/gcc/config/bpf/bpf.cc b/gcc/config/bpf/bpf.cc > index a0956a069729..764a3e487cb6 100644 > --- a/gcc/config/bpf/bpf.cc > +++ b/gcc/config/bpf/bpf.cc > @@ -1115,6 +1115,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; > diff --git a/gcc/config/bpf/bpf.h b/gcc/config/bpf/bpf.h > index 82702aa7b6ba..1f177ec4c4ef 100644 > --- a/gcc/config/bpf/bpf.h > +++ b/gcc/config/bpf/bpf.h > @@ -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
Thanks! Committed ! Jose E. Marchesi writes: > Hi Cuper. > > Sorry, I missed this patch last week. > This is OK. > > Thanks! > >> 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 | 16 ++++++++++++++++ >> gcc/config/bpf/bpf.h | 5 +++++ >> 2 files changed, 21 insertions(+) >> >> diff --git a/gcc/config/bpf/bpf.cc b/gcc/config/bpf/bpf.cc >> index a0956a069729..764a3e487cb6 100644 >> --- a/gcc/config/bpf/bpf.cc >> +++ b/gcc/config/bpf/bpf.cc >> @@ -1115,6 +1115,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; >> diff --git a/gcc/config/bpf/bpf.h b/gcc/config/bpf/bpf.h >> index 82702aa7b6ba..1f177ec4c4ef 100644 >> --- a/gcc/config/bpf/bpf.h >> +++ b/gcc/config/bpf/bpf.h >> @@ -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
Thanks! Committed! Jose E. Marchesi writes: > Hi Cuper. > > Sorry, I missed this patch last week. > This is OK. > > Thanks! > >> 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 | 16 ++++++++++++++++ >> gcc/config/bpf/bpf.h | 5 +++++ >> 2 files changed, 21 insertions(+) >> >> diff --git a/gcc/config/bpf/bpf.cc b/gcc/config/bpf/bpf.cc >> index a0956a069729..764a3e487cb6 100644 >> --- a/gcc/config/bpf/bpf.cc >> +++ b/gcc/config/bpf/bpf.cc >> @@ -1115,6 +1115,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; >> diff --git a/gcc/config/bpf/bpf.h b/gcc/config/bpf/bpf.h >> index 82702aa7b6ba..1f177ec4c4ef 100644 >> --- a/gcc/config/bpf/bpf.h >> +++ b/gcc/config/bpf/bpf.h >> @@ -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
diff --git a/gcc/config/bpf/bpf.cc b/gcc/config/bpf/bpf.cc index a0956a069729..764a3e487cb6 100644 --- a/gcc/config/bpf/bpf.cc +++ b/gcc/config/bpf/bpf.cc @@ -1115,6 +1115,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; diff --git a/gcc/config/bpf/bpf.h b/gcc/config/bpf/bpf.h index 82702aa7b6ba..1f177ec4c4ef 100644 --- a/gcc/config/bpf/bpf.h +++ b/gcc/config/bpf/bpf.h @@ -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