[PATCH] x86: Make stringop_algs::stringop_strategy ctor constexpr [PR100246]

Jakub Jelinek jakub@redhat.com
Thu Nov 4 12:45:38 GMT 2021


On Thu, Nov 04, 2021 at 12:39:34PM +0000, Iain Sandoe wrote:
> Bootstrap succeeded with Apple clang-503.0.40 (Xcode 5.1.1) on macOS 10.8
> which is the earliest version I expect to work (previous xcode impl. have more
> C++11 incompatibilities).   So OK from a Darwin PoV.
> 
> The other reported toolchain with the issue was GCC-4.9.2 as discussed on
> IRC - this also seems OK.

Yeah, I've been testing it on a short testcase with just enum stringop_alg,
struct stringop_algs and ix86_size_memcpy on godbolt too:
https://godbolt.org/z/vfcz8xen6
enum stringop_alg {
no_stringop, libcall, rep_prefix_1_byte, rep_prefix_4_byte, rep_prefix_8_byte,
loop_1_byte, loop, unrolled_loop, vector_loop, last_alg
};
struct stringop_algs
{
  const enum stringop_alg unknown_size;
  const struct stringop_strategy {
#ifndef NO_CTOR
#ifdef CONSTEXPR
    constexpr
#endif
    stringop_strategy(int _max = -1, enum stringop_alg _alg = libcall, int _noalign = false)
      : max (_max), alg (_alg), noalign (_noalign) {}
#endif
    const int max;
    const enum stringop_alg alg;
    int noalign;
  } size [4];
};
stringop_algs ix86_size_memcpy[2] = {
  {rep_prefix_1_byte, {{-1, rep_prefix_1_byte, false}}},
  {rep_prefix_1_byte, {{-1, rep_prefix_1_byte, false}}}};
and tested the various cases, no stringop_strategy ctor at all, the ctor
and ctor with constexpr.
clang before 3.3 is unhappy about all the 3 cases, clang 3.3 and 3.4
is ok with ctor and ctor with constexpr and optimizes it into static
initialization, clang 3.5+ is ok with all 3 versions and optimizes,
gcc 4.8 and 5+ is ok with all 3 versions and no ctor and ctor with constexpr
is optimized, gcc 4.9 is unhappy about the no ctor case and happy with the
other two.

> > Especially because 11.x is not going to have the dyninit optimization for
> > sure, it would be nice to do this on the 11 branch too.
> > 
> > 2021-11-04  Jakub Jelinek  <jakub@redhat.com>
> > 
> > 	PR bootstrap/100246
> > 	* config/i386/i386.h
> > 	(stringop_algs::stringop_strategy::stringop_strategy): Make the ctor
> > 	constexpr.
> > 
> > --- gcc/config/i386/i386.h.jj	2021-09-28 23:18:35.282563395 +0200
> > +++ gcc/config/i386/i386.h	2021-11-04 10:48:47.165086806 +0100
> > @@ -78,8 +78,9 @@ struct stringop_algs
> >        this issue.  Since this header is used by code compiled with the C
> >        compiler we must guard the addition.  */
> > #ifdef __cplusplus
> > -    stringop_strategy(int _max = -1, enum stringop_alg _alg = libcall,
> > -		      int _noalign = false)
> > +    constexpr stringop_strategy(int _max = -1,
> > +				enum stringop_alg _alg = libcall,
> > +				int _noalign = false)
> >       : max (_max), alg (_alg), noalign (_noalign) {}
> > #endif
> >     const int max;

	Jakub



More information about the Gcc-patches mailing list