[PING][PATCH] define auto_vec copy ctor and assignment (PR 90904)

Christophe Lyon christophe.lyon.oss@gmail.com
Fri Aug 6 07:52:48 GMT 2021


On Fri, Aug 6, 2021 at 4:07 AM Martin Sebor via Gcc-patches <
gcc-patches@gcc.gnu.org> wrote:

> On 7/30/21 9:06 AM, Jason Merrill wrote:
> > On 7/27/21 2:56 PM, Martin Sebor wrote:
> >> Ping: https://gcc.gnu.org/pipermail/gcc-patches/2021-July/575690.html
> >>
> >> Are there any other suggestions or comments or is the latest revision
> >> okay to commit?
> >
> > OK.
>
> I had to make a few more adjustments to fix up code that's snuck
> in since I last tested the patch.  I committed r12-2776 after
> retesting on x86_64-linux.
>
> With the cleanup out of the way I'll resubmit the copy ctor patch
> next.
>
>
Hi Martin,

Your patch breaks the aarch64 build:
 /tmp/1784440_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/config/aarch64/aarch64-sve-builtins.cc:
In function 'void aarch64_sve::register_svpattern()':
/tmp/1784440_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/config/aarch64/aarch64-sve-builtins.cc:3502:27:
error: use of deleted function 'vec<T>::vec(auto_vec<T, N>&) [with long
unsigned int N = 32ul;
T = std::pair<const char*, int>]'
        "svpattern", values);
                           ^
In file included from
/tmp/1784440_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/hash-table.h:248:0,
                 from
/tmp/1784440_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/coretypes.h:480,
                 from
/tmp/1784440_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/config/aarch64/aarch64-sve-builtins.cc:24:
/tmp/1784440_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/vec.h:1455:3:
error: declared here
   vec (auto_vec<T, N> &) = delete;
   ^
/tmp/1784440_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/config/aarch64/aarch64-sve-builtins.cc:
In function 'void aarch64_sve::register_svprfop()':
/tmp/1784440_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/config/aarch64/aarch64-sve-builtins.cc:3516:30:
error: use of deleted function 'vec<T>::vec(auto_vec<T, N>&) [with long
unsigned int N = 16ul;
T = std::pair<const char*, int>]'
             "svprfop", values);
                              ^
In file included from
/tmp/1784440_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/hash-table.h:248:0,
                 from
/tmp/1784440_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/coretypes.h:480,
                 from
/tmp/1784440_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/config/aarch64/aarch64-sve-builtins.cc:24:
/tmp/1784440_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/vec.h:1455:3:
error: declared here
   vec (auto_vec<T, N> &) = delete;
   ^

Can you check?

Thanks,

Christophe

>
> Martin
>
> >
> >> On 7/20/21 12:34 PM, Martin Sebor wrote:
> >>> On 7/14/21 10:23 AM, Jason Merrill wrote:
> >>>> On 7/14/21 10:46 AM, Martin Sebor wrote:
> >>>>> On 7/13/21 9:39 PM, Jason Merrill wrote:
> >>>>>> On 7/13/21 4:02 PM, Martin Sebor wrote:
> >>>>>>> On 7/13/21 12:37 PM, Jason Merrill wrote:
> >>>>>>>> On 7/13/21 10:08 AM, Jonathan Wakely wrote:
> >>>>>>>>> On Mon, 12 Jul 2021 at 12:02, Richard Biener wrote:
> >>>>>>>>>> Somebody with more C++ knowledge than me needs to approve the
> >>>>>>>>>> vec.h changes - I don't feel competent to assess all effects
> >>>>>>>>>> of the change.
> >>>>>>>>>
> >>>>>>>>> They look OK to me except for:
> >>>>>>>>>
> >>>>>>>>> -extern vnull vNULL;
> >>>>>>>>> +static constexpr vnull vNULL{ };
> >>>>>>>>>
> >>>>>>>>> Making vNULL have static linkage can make it an ODR violation
> >>>>>>>>> to use
> >>>>>>>>> vNULL in templates and inline functions, because different
> >>>>>>>>> instantiations will refer to a different "vNULL" in each
> >>>>>>>>> translation
> >>>>>>>>> unit.
> >>>>>>>>
> >>>>>>>> The ODR says this is OK because it's a literal constant with the
> >>>>>>>> same value (6.2/12.2.1).
> >>>>>>>>
> >>>>>>>> But it would be better without the explicit 'static'; then in
> >>>>>>>> C++17 it's implicitly inline instead of static.
> >>>>>>>
> >>>>>>> I'll remove the static.
> >>>>>>>
> >>>>>>>>
> >>>>>>>> But then, do we really want to keep vNULL at all?  It's a weird
> >>>>>>>> blurring of the object/pointer boundary that is also dependent
> >>>>>>>> on vec being a thin wrapper around a pointer.  In almost all
> >>>>>>>> cases it can be replaced with {}; one exception is ==
> >>>>>>>> comparison, where it seems to be testing that the embedded
> >>>>>>>> pointer is null, which is a weird thing to want to test.
> >>>>>>>
> >>>>>>> The one use case I know of for vNULL where I can't think of
> >>>>>>> an equally good substitute is in passing a vec as an argument by
> >>>>>>> value.  The only way to do that that I can think of is to name
> >>>>>>> the full vec type (i.e., the specialization) which is more typing
> >>>>>>> and less generic than vNULL.  I don't use vNULL myself so I
> wouldn't
> >>>>>>> miss this trick if it were to be removed but others might feel
> >>>>>>> differently.
> >>>>>>
> >>>>>> In C++11, it can be replaced by {} in that context as well.
> >>>>>
> >>>>> Cool.  I thought I'd tried { } here but I guess not.
> >>>>>
> >>>>>>
> >>>>>>> If not, I'm all for getting rid of vNULL but with over 350 uses
> >>>>>>> of it left, unless there's some clever trick to make the removal
> >>>>>>> (mostly) effortless and seamless, I'd much rather do it
> >>>>>>> independently
> >>>>>>> of this initial change. I also don't know if I can commit to making
> >>>>>>> all this cleanup.
> >>>>>>
> >>>>>> I already have a patch to replace all but one use of vNULL, but
> >>>>>> I'll hold off with it until after your patch.
> >>>>>
> >>>>> So what's the next step?  The patch only removes a few uses of vNULL
> >>>>> but doesn't add any.  Is it good to go as is (without the static and
> >>>>> with the additional const changes Richard suggested)?  This patch is
> >>>>> attached to my reply to Richard:
> >>>>> https://gcc.gnu.org/pipermail/gcc-patches/2021-July/575199.html
> >>>>
> >>>> As Richard wrote:
> >>>>
> >>>>> The pieces where you change vec<> passing to const vec<>& and the few
> >>>>> where you change vec<> * to const vec<> * are OK - this should make
> >>>>> the
> >>>>> rest a smaller piece to review.
> >>>>
> >>>> Please go ahead and apply those changes and send a new patch with
> >>>> the remainder of the changes.
> >>>
> >>> I have just pushed r12-2418:
> >>> https://gcc.gnu.org/pipermail/gcc-cvs/2021-July/350886.html
> >>>
> >>>>
> >>>> A few other comments:
> >>>>
> >>>>> -                       omp_declare_simd_clauses);
> >>>>> +                       *omp_declare_simd_clauses);
> >>>>
> >>>> Instead of doing this indirection in all of the callers, let's
> >>>> change c_finish_omp_declare_simd to take a pointer as well, and do
> >>>> the indirection in initializing a reference variable at the top of
> >>>> the function.
> >>>
> >>> Okay.
> >>>
> >>>>
> >>>>> +    sched_init_luids (bbs.to_vec ());
> >>>>> +    haifa_init_h_i_d (bbs.to_vec ());
> >>>>
> >>>> Why are these to_vec changes needed when you are also changing the
> >>>> functions to take const&?
> >>>
> >>> Calling to_vec() here isn't necessary so I've removed it.
> >>>
> >>>>
> >>>>> -  vec<tree> checks = LOOP_VINFO_CHECK_NONZERO (loop_vinfo);
> >>>>> +  vec<tree> checks = LOOP_VINFO_CHECK_NONZERO (loop_vinfo).to_vec
> ();
> >>>>
> >>>> Why not use a reference here and in other similar spots?
> >>>
> >>> Sure, that works too.
> >>>
> >>> Attached is what's left of the original changes now that r12-2418
> >>> has been applied.
> >>>
> >>> Martin
> >>
> >
>
>


More information about the Gcc-patches mailing list