Re: [PATCH 1/2] vec: Add array_slice constructors from non-const and gc vectors

2022-08-30 Thread Richard Sandiford via Gcc-patches
Richard Biener  writes:
> On Mon, 29 Aug 2022, Martin Jambor wrote:
>
>> Hi,
>> 
>> On Mon, Aug 29 2022, Richard Biener wrote:
>> > On Mon, 29 Aug 2022, Martin Jambor wrote:
>> >
>> >> Hi again,
>> >> 
>> >> On Mon, Aug 29 2022, Richard Biener wrote:
>> >> > On Fri, 26 Aug 2022, Martin Jambor wrote:
>> >> >
>> >> >> Hi,
>> >> >> 
>> >> >> On Fri, Aug 26 2022, Richard Biener wrote:
>> >> >> >> Am 26.08.2022 um 18:39 schrieb Martin Jambor :
>> >> >> >>
>> >> >> >> Hi,
>> >> >> >>
>> >> >> >> This patch adds constructors of array_slice that are required to
>> >> >> >> create them from non-const (heap or auto) vectors or from GC 
>> >> >> >> vectors.
>> >> >> >>
>> >> >> >> The use of non-const array_slices is somewhat limited, as creating 
>> >> >> >> one
>> >> >> >> from const vec still leads to array_slice> >> >> >> some_type>,
>> >> >> >> so I eventually also only resorted to having read-only array_slices.
>> >> >> >> But I do need the constructor from the gc vector.
>> >> >> >>
>> >> >> >> Bootstrapped and tested along code that actually uses it on
>> >> >> >> x86_64-linux.  OK for trunk?
>> >> >> >>
>> >> >> >> Thanks,
>> >> >> >>
>> >> >> >> Martin
>> >> >> >>
>> >> >> >>
>> >> >> >> gcc/ChangeLog:
>> >> >> >>
>> >> >> >> 2022-08-08  Martin Jambor  
>> >> >> >>
>> >> >> >>* vec.h (array_slice): Add constructors for non-const reference 
>> >> >> >> to
>> >> >> >>heap vector and pointers to heap vectors.
>> >> >> >> ---
>> >> >> >> gcc/vec.h | 12 
>> >> >> >> 1 file changed, 12 insertions(+)
>> >> >> >>
>> >> >> >> diff --git a/gcc/vec.h b/gcc/vec.h
>> >> >> >> index eed075addc9..b0477e1044c 100644
>> >> >> >> --- a/gcc/vec.h
>> >> >> >> +++ b/gcc/vec.h
>> >> >> >> @@ -2264,6 +2264,18 @@ public:
>> >> >> >>   array_slice (const vec )
>> >> >> >> : m_base (v.address ()), m_size (v.length ()) {}
>> >> >> >>
>> >> >> >> +  template
>> >> >> >> +  array_slice (vec )
>> >> >> >> +: m_base (v.address ()), m_size (v.length ()) {}
>> >> >> >> +
>> >> >> >> +  template
>> >> >> >> +  array_slice (const vec *v)
>> >> >> >> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length 
>> >> >> >> () : 0) {}
>> >> >> >> +
>> >> >> >> +  template
>> >> >> >> +  array_slice (vec *v)
>> >> >> >> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length 
>> >> >> >> () : 0) {}
>> >> >> >> +
>> >> >> >
>> >> >> > I don?t quite understand why the generic ctor doesn?t cover the GC 
>> >> >> > case.  It looks more like reference vs pointer?
>> >> >> >
>> >> >> 
>> >> >> If you think that this should work:
>> >> >> 
>> >> >>   vec *heh = cfun->local_decls;
>> >> >>   array_slice arr_slice (*heh);
>> >> >> 
>> >> >> then it does not:
>> >> >> 
>> >> >>   /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:6693:36: error: no matching 
>> >> >> function for call to 
>> >> >> ?array_slice::array_slice(vec&)?
>> >> >>6693 |   array_slice arr_slice (*heh);
>> >> >> |^
>> >> >>   In file included from 
>> >> >> /home/mjambor/gcc/mine/src/gcc/hash-table.h:248,
>> >> >>from /home/mjambor/gcc/mine/src/gcc/coretypes.h:486,
>> >> >>from /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:105:
>> >> >>   /home/mjambor/gcc/mine/src/gcc/vec.h:2264:3: note: candidate: 
>> >> >> ?template array_slice::array_slice(const 
>> >> >> vec&) [with T = tree_node*]?
>> >> >>2264 |   array_slice (const vec )
>> >> >> |   ^~~
>> >> >>   /home/mjambor/gcc/mine/src/gcc/vec.h:2264:3: note:   template 
>> >> >> argument deduction/substitution failed:
>> >> >>   /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:6693:36: note:   mismatched 
>> >> >> types ?va_heap? and ?va_gc?
>> >> >>6693 |   array_slice arr_slice (*heh);
>> >> >> |^
>> >> >> 
>> >> >>   [... I trimmed notes about all other candidates...]
>> >> >> 
>> >> >> Or did you mean something else?
>> >> >
>> >> > Hmm, so what if you change
>> >> >
>> >> >   template
>> >> >   array_slice (const vec )
>> >> > : m_base (v.address ()), m_size (v.length ()) {}
>> >> >
>> >> > to
>> >> >
>> >> >   template
>> >> >   array_slice (const vec )
>> >> > : m_base (v.address ()), m_size (v.length ()) {}
>> >> >
>> >> > instead?  Thus allow any allocation / placement template arg?
>> >> >
>> >> 
>> >> So being fully awake helps, the issue was of course in how I tested the
>> >> code, the above works fine and I can adapt my code to use that.
>> >> 
>> >> However, is it really preferable?
>> >> 
>> >> We often use NULL as to mean zero-length vector, which my code handled
>> >> gracefully:
>> >> 
>> >> +  template
>> >> +  array_slice (const vec *v)
>> >> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 
>> >> 0) {}
>> >> 
>> >> whereas using the generic method will mean that users constructing the
>> >> vector will have to special case it - and I bet most will end up using
>> >> the above sequence and the constructor 

Re: [PATCH 1/2] vec: Add array_slice constructors from non-const and gc vectors

2022-08-29 Thread Richard Biener via Gcc-patches
On Mon, 29 Aug 2022, Martin Jambor wrote:

> Hi,
> 
> On Mon, Aug 29 2022, Richard Biener wrote:
> > On Mon, 29 Aug 2022, Martin Jambor wrote:
> >
> >> Hi again,
> >> 
> >> On Mon, Aug 29 2022, Richard Biener wrote:
> >> > On Fri, 26 Aug 2022, Martin Jambor wrote:
> >> >
> >> >> Hi,
> >> >> 
> >> >> On Fri, Aug 26 2022, Richard Biener wrote:
> >> >> >> Am 26.08.2022 um 18:39 schrieb Martin Jambor :
> >> >> >>
> >> >> >> Hi,
> >> >> >>
> >> >> >> This patch adds constructors of array_slice that are required to
> >> >> >> create them from non-const (heap or auto) vectors or from GC vectors.
> >> >> >>
> >> >> >> The use of non-const array_slices is somewhat limited, as creating 
> >> >> >> one
> >> >> >> from const vec still leads to array_slice >> >> >> some_type>,
> >> >> >> so I eventually also only resorted to having read-only array_slices.
> >> >> >> But I do need the constructor from the gc vector.
> >> >> >>
> >> >> >> Bootstrapped and tested along code that actually uses it on
> >> >> >> x86_64-linux.  OK for trunk?
> >> >> >>
> >> >> >> Thanks,
> >> >> >>
> >> >> >> Martin
> >> >> >>
> >> >> >>
> >> >> >> gcc/ChangeLog:
> >> >> >>
> >> >> >> 2022-08-08  Martin Jambor  
> >> >> >>
> >> >> >>* vec.h (array_slice): Add constructors for non-const reference to
> >> >> >>heap vector and pointers to heap vectors.
> >> >> >> ---
> >> >> >> gcc/vec.h | 12 
> >> >> >> 1 file changed, 12 insertions(+)
> >> >> >>
> >> >> >> diff --git a/gcc/vec.h b/gcc/vec.h
> >> >> >> index eed075addc9..b0477e1044c 100644
> >> >> >> --- a/gcc/vec.h
> >> >> >> +++ b/gcc/vec.h
> >> >> >> @@ -2264,6 +2264,18 @@ public:
> >> >> >>   array_slice (const vec )
> >> >> >> : m_base (v.address ()), m_size (v.length ()) {}
> >> >> >>
> >> >> >> +  template
> >> >> >> +  array_slice (vec )
> >> >> >> +: m_base (v.address ()), m_size (v.length ()) {}
> >> >> >> +
> >> >> >> +  template
> >> >> >> +  array_slice (const vec *v)
> >> >> >> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length 
> >> >> >> () : 0) {}
> >> >> >> +
> >> >> >> +  template
> >> >> >> +  array_slice (vec *v)
> >> >> >> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length 
> >> >> >> () : 0) {}
> >> >> >> +
> >> >> >
> >> >> > I don?t quite understand why the generic ctor doesn?t cover the GC 
> >> >> > case.  It looks more like reference vs pointer?
> >> >> >
> >> >> 
> >> >> If you think that this should work:
> >> >> 
> >> >>   vec *heh = cfun->local_decls;
> >> >>   array_slice arr_slice (*heh);
> >> >> 
> >> >> then it does not:
> >> >> 
> >> >>   /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:6693:36: error: no matching 
> >> >> function for call to 
> >> >> ?array_slice::array_slice(vec&)?
> >> >>6693 |   array_slice arr_slice (*heh);
> >> >> |^
> >> >>   In file included from /home/mjambor/gcc/mine/src/gcc/hash-table.h:248,
> >> >>from /home/mjambor/gcc/mine/src/gcc/coretypes.h:486,
> >> >>from /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:105:
> >> >>   /home/mjambor/gcc/mine/src/gcc/vec.h:2264:3: note: candidate: 
> >> >> ?template array_slice::array_slice(const vec&) 
> >> >> [with T = tree_node*]?
> >> >>2264 |   array_slice (const vec )
> >> >> |   ^~~
> >> >>   /home/mjambor/gcc/mine/src/gcc/vec.h:2264:3: note:   template 
> >> >> argument deduction/substitution failed:
> >> >>   /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:6693:36: note:   mismatched 
> >> >> types ?va_heap? and ?va_gc?
> >> >>6693 |   array_slice arr_slice (*heh);
> >> >> |^
> >> >> 
> >> >>   [... I trimmed notes about all other candidates...]
> >> >> 
> >> >> Or did you mean something else?
> >> >
> >> > Hmm, so what if you change
> >> >
> >> >   template
> >> >   array_slice (const vec )
> >> > : m_base (v.address ()), m_size (v.length ()) {}
> >> >
> >> > to
> >> >
> >> >   template
> >> >   array_slice (const vec )
> >> > : m_base (v.address ()), m_size (v.length ()) {}
> >> >
> >> > instead?  Thus allow any allocation / placement template arg?
> >> >
> >> 
> >> So being fully awake helps, the issue was of course in how I tested the
> >> code, the above works fine and I can adapt my code to use that.
> >> 
> >> However, is it really preferable?
> >> 
> >> We often use NULL as to mean zero-length vector, which my code handled
> >> gracefully:
> >> 
> >> +  template
> >> +  array_slice (const vec *v)
> >> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 0) 
> >> {}
> >> 
> >> whereas using the generic method will mean that users constructing the
> >> vector will have to special case it - and I bet most will end up using
> >> the above sequence and the constructor from explicit pointer and size in
> >> all constructors from gc vectors.
> >> 
> >> So, should I really change the patch and my code?
> >
> > Well, it's also inconsistent with a supposed use like
> 

Re: [PATCH 1/2] vec: Add array_slice constructors from non-const and gc vectors

2022-08-29 Thread Martin Jambor
Hi,

On Mon, Aug 29 2022, Richard Biener wrote:
> On Mon, 29 Aug 2022, Martin Jambor wrote:
>
>> Hi again,
>> 
>> On Mon, Aug 29 2022, Richard Biener wrote:
>> > On Fri, 26 Aug 2022, Martin Jambor wrote:
>> >
>> >> Hi,
>> >> 
>> >> On Fri, Aug 26 2022, Richard Biener wrote:
>> >> >> Am 26.08.2022 um 18:39 schrieb Martin Jambor :
>> >> >>
>> >> >> Hi,
>> >> >>
>> >> >> This patch adds constructors of array_slice that are required to
>> >> >> create them from non-const (heap or auto) vectors or from GC vectors.
>> >> >>
>> >> >> The use of non-const array_slices is somewhat limited, as creating one
>> >> >> from const vec still leads to array_slice,
>> >> >> so I eventually also only resorted to having read-only array_slices.
>> >> >> But I do need the constructor from the gc vector.
>> >> >>
>> >> >> Bootstrapped and tested along code that actually uses it on
>> >> >> x86_64-linux.  OK for trunk?
>> >> >>
>> >> >> Thanks,
>> >> >>
>> >> >> Martin
>> >> >>
>> >> >>
>> >> >> gcc/ChangeLog:
>> >> >>
>> >> >> 2022-08-08  Martin Jambor  
>> >> >>
>> >> >>* vec.h (array_slice): Add constructors for non-const reference to
>> >> >>heap vector and pointers to heap vectors.
>> >> >> ---
>> >> >> gcc/vec.h | 12 
>> >> >> 1 file changed, 12 insertions(+)
>> >> >>
>> >> >> diff --git a/gcc/vec.h b/gcc/vec.h
>> >> >> index eed075addc9..b0477e1044c 100644
>> >> >> --- a/gcc/vec.h
>> >> >> +++ b/gcc/vec.h
>> >> >> @@ -2264,6 +2264,18 @@ public:
>> >> >>   array_slice (const vec )
>> >> >> : m_base (v.address ()), m_size (v.length ()) {}
>> >> >>
>> >> >> +  template
>> >> >> +  array_slice (vec )
>> >> >> +: m_base (v.address ()), m_size (v.length ()) {}
>> >> >> +
>> >> >> +  template
>> >> >> +  array_slice (const vec *v)
>> >> >> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () 
>> >> >> : 0) {}
>> >> >> +
>> >> >> +  template
>> >> >> +  array_slice (vec *v)
>> >> >> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () 
>> >> >> : 0) {}
>> >> >> +
>> >> >
>> >> > I don?t quite understand why the generic ctor doesn?t cover the GC 
>> >> > case.  It looks more like reference vs pointer?
>> >> >
>> >> 
>> >> If you think that this should work:
>> >> 
>> >>   vec *heh = cfun->local_decls;
>> >>   array_slice arr_slice (*heh);
>> >> 
>> >> then it does not:
>> >> 
>> >>   /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:6693:36: error: no matching 
>> >> function for call to 
>> >> ?array_slice::array_slice(vec&)?
>> >>6693 |   array_slice arr_slice (*heh);
>> >> |^
>> >>   In file included from /home/mjambor/gcc/mine/src/gcc/hash-table.h:248,
>> >>from /home/mjambor/gcc/mine/src/gcc/coretypes.h:486,
>> >>from /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:105:
>> >>   /home/mjambor/gcc/mine/src/gcc/vec.h:2264:3: note: candidate: 
>> >> ?template array_slice::array_slice(const vec&) 
>> >> [with T = tree_node*]?
>> >>2264 |   array_slice (const vec )
>> >> |   ^~~
>> >>   /home/mjambor/gcc/mine/src/gcc/vec.h:2264:3: note:   template argument 
>> >> deduction/substitution failed:
>> >>   /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:6693:36: note:   mismatched 
>> >> types ?va_heap? and ?va_gc?
>> >>6693 |   array_slice arr_slice (*heh);
>> >> |^
>> >> 
>> >>   [... I trimmed notes about all other candidates...]
>> >> 
>> >> Or did you mean something else?
>> >
>> > Hmm, so what if you change
>> >
>> >   template
>> >   array_slice (const vec )
>> > : m_base (v.address ()), m_size (v.length ()) {}
>> >
>> > to
>> >
>> >   template
>> >   array_slice (const vec )
>> > : m_base (v.address ()), m_size (v.length ()) {}
>> >
>> > instead?  Thus allow any allocation / placement template arg?
>> >
>> 
>> So being fully awake helps, the issue was of course in how I tested the
>> code, the above works fine and I can adapt my code to use that.
>> 
>> However, is it really preferable?
>> 
>> We often use NULL as to mean zero-length vector, which my code handled
>> gracefully:
>> 
>> +  template
>> +  array_slice (const vec *v)
>> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 0) {}
>> 
>> whereas using the generic method will mean that users constructing the
>> vector will have to special case it - and I bet most will end up using
>> the above sequence and the constructor from explicit pointer and size in
>> all constructors from gc vectors.
>> 
>> So, should I really change the patch and my code?
>
> Well, it's also inconsistent with a supposed use like
>
>   vec *v = NULL;
>   auto slice = array_slice (v);
>
> no?  So, if we want to provide a "safe" (as in, handle NULL pointer)
> CTOR, don't we want to handle non-GC allocated vectors the same way?
>

Our safe_* functions usually do no work with normal non-GC vectors
(which are not vl_embed), they do not accept them.  I guess that is
because that is 

Re: [PATCH 1/2] vec: Add array_slice constructors from non-const and gc vectors

2022-08-29 Thread Richard Biener via Gcc-patches
On Mon, 29 Aug 2022, Martin Jambor wrote:

> Hi again,
> 
> On Mon, Aug 29 2022, Richard Biener wrote:
> > On Fri, 26 Aug 2022, Martin Jambor wrote:
> >
> >> Hi,
> >> 
> >> On Fri, Aug 26 2022, Richard Biener wrote:
> >> >> Am 26.08.2022 um 18:39 schrieb Martin Jambor :
> >> >>
> >> >> Hi,
> >> >>
> >> >> This patch adds constructors of array_slice that are required to
> >> >> create them from non-const (heap or auto) vectors or from GC vectors.
> >> >>
> >> >> The use of non-const array_slices is somewhat limited, as creating one
> >> >> from const vec still leads to array_slice,
> >> >> so I eventually also only resorted to having read-only array_slices.
> >> >> But I do need the constructor from the gc vector.
> >> >>
> >> >> Bootstrapped and tested along code that actually uses it on
> >> >> x86_64-linux.  OK for trunk?
> >> >>
> >> >> Thanks,
> >> >>
> >> >> Martin
> >> >>
> >> >>
> >> >> gcc/ChangeLog:
> >> >>
> >> >> 2022-08-08  Martin Jambor  
> >> >>
> >> >>* vec.h (array_slice): Add constructors for non-const reference to
> >> >>heap vector and pointers to heap vectors.
> >> >> ---
> >> >> gcc/vec.h | 12 
> >> >> 1 file changed, 12 insertions(+)
> >> >>
> >> >> diff --git a/gcc/vec.h b/gcc/vec.h
> >> >> index eed075addc9..b0477e1044c 100644
> >> >> --- a/gcc/vec.h
> >> >> +++ b/gcc/vec.h
> >> >> @@ -2264,6 +2264,18 @@ public:
> >> >>   array_slice (const vec )
> >> >> : m_base (v.address ()), m_size (v.length ()) {}
> >> >>
> >> >> +  template
> >> >> +  array_slice (vec )
> >> >> +: m_base (v.address ()), m_size (v.length ()) {}
> >> >> +
> >> >> +  template
> >> >> +  array_slice (const vec *v)
> >> >> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 
> >> >> 0) {}
> >> >> +
> >> >> +  template
> >> >> +  array_slice (vec *v)
> >> >> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 
> >> >> 0) {}
> >> >> +
> >> >
> >> > I don?t quite understand why the generic ctor doesn?t cover the GC case. 
> >> >  It looks more like reference vs pointer?
> >> >
> >> 
> >> If you think that this should work:
> >> 
> >>   vec *heh = cfun->local_decls;
> >>   array_slice arr_slice (*heh);
> >> 
> >> then it does not:
> >> 
> >>   /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:6693:36: error: no matching 
> >> function for call to ?array_slice::array_slice(vec >> va_gc>&)?
> >>6693 |   array_slice arr_slice (*heh);
> >> |^
> >>   In file included from /home/mjambor/gcc/mine/src/gcc/hash-table.h:248,
> >>from /home/mjambor/gcc/mine/src/gcc/coretypes.h:486,
> >>from /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:105:
> >>   /home/mjambor/gcc/mine/src/gcc/vec.h:2264:3: note: candidate: 
> >> ?template array_slice::array_slice(const vec&) 
> >> [with T = tree_node*]?
> >>2264 |   array_slice (const vec )
> >> |   ^~~
> >>   /home/mjambor/gcc/mine/src/gcc/vec.h:2264:3: note:   template argument 
> >> deduction/substitution failed:
> >>   /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:6693:36: note:   mismatched 
> >> types ?va_heap? and ?va_gc?
> >>6693 |   array_slice arr_slice (*heh);
> >> |^
> >> 
> >>   [... I trimmed notes about all other candidates...]
> >> 
> >> Or did you mean something else?
> >
> > Hmm, so what if you change
> >
> >   template
> >   array_slice (const vec )
> > : m_base (v.address ()), m_size (v.length ()) {}
> >
> > to
> >
> >   template
> >   array_slice (const vec )
> > : m_base (v.address ()), m_size (v.length ()) {}
> >
> > instead?  Thus allow any allocation / placement template arg?
> >
> 
> So being fully awake helps, the issue was of course in how I tested the
> code, the above works fine and I can adapt my code to use that.
> 
> However, is it really preferable?
> 
> We often use NULL as to mean zero-length vector, which my code handled
> gracefully:
> 
> +  template
> +  array_slice (const vec *v)
> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 0) {}
> 
> whereas using the generic method will mean that users constructing the
> vector will have to special case it - and I bet most will end up using
> the above sequence and the constructor from explicit pointer and size in
> all constructors from gc vectors.
> 
> So, should I really change the patch and my code?

Well, it's also inconsistent with a supposed use like

  vec *v = NULL;
  auto slice = array_slice (v);

no?  So, if we want to provide a "safe" (as in, handle NULL pointer)
CTOR, don't we want to handle non-GC allocated vectors the same way?

Btw, we have

  template
  array_slice (T ()[N]) : m_base (array), m_size (N) {}

which would suggest handling NULL isn't desired(?)

Richard.


Re: [PATCH 1/2] vec: Add array_slice constructors from non-const and gc vectors

2022-08-29 Thread Martin Jambor
Hi again,

On Mon, Aug 29 2022, Richard Biener wrote:
> On Fri, 26 Aug 2022, Martin Jambor wrote:
>
>> Hi,
>> 
>> On Fri, Aug 26 2022, Richard Biener wrote:
>> >> Am 26.08.2022 um 18:39 schrieb Martin Jambor :
>> >>
>> >> Hi,
>> >>
>> >> This patch adds constructors of array_slice that are required to
>> >> create them from non-const (heap or auto) vectors or from GC vectors.
>> >>
>> >> The use of non-const array_slices is somewhat limited, as creating one
>> >> from const vec still leads to array_slice,
>> >> so I eventually also only resorted to having read-only array_slices.
>> >> But I do need the constructor from the gc vector.
>> >>
>> >> Bootstrapped and tested along code that actually uses it on
>> >> x86_64-linux.  OK for trunk?
>> >>
>> >> Thanks,
>> >>
>> >> Martin
>> >>
>> >>
>> >> gcc/ChangeLog:
>> >>
>> >> 2022-08-08  Martin Jambor  
>> >>
>> >>* vec.h (array_slice): Add constructors for non-const reference to
>> >>heap vector and pointers to heap vectors.
>> >> ---
>> >> gcc/vec.h | 12 
>> >> 1 file changed, 12 insertions(+)
>> >>
>> >> diff --git a/gcc/vec.h b/gcc/vec.h
>> >> index eed075addc9..b0477e1044c 100644
>> >> --- a/gcc/vec.h
>> >> +++ b/gcc/vec.h
>> >> @@ -2264,6 +2264,18 @@ public:
>> >>   array_slice (const vec )
>> >> : m_base (v.address ()), m_size (v.length ()) {}
>> >>
>> >> +  template
>> >> +  array_slice (vec )
>> >> +: m_base (v.address ()), m_size (v.length ()) {}
>> >> +
>> >> +  template
>> >> +  array_slice (const vec *v)
>> >> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 
>> >> 0) {}
>> >> +
>> >> +  template
>> >> +  array_slice (vec *v)
>> >> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 
>> >> 0) {}
>> >> +
>> >
>> > I don?t quite understand why the generic ctor doesn?t cover the GC case.  
>> > It looks more like reference vs pointer?
>> >
>> 
>> If you think that this should work:
>> 
>>   vec *heh = cfun->local_decls;
>>   array_slice arr_slice (*heh);
>> 
>> then it does not:
>> 
>>   /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:6693:36: error: no matching 
>> function for call to ?array_slice::array_slice(vec> va_gc>&)?
>>6693 |   array_slice arr_slice (*heh);
>> |^
>>   In file included from /home/mjambor/gcc/mine/src/gcc/hash-table.h:248,
>>from /home/mjambor/gcc/mine/src/gcc/coretypes.h:486,
>>from /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:105:
>>   /home/mjambor/gcc/mine/src/gcc/vec.h:2264:3: note: candidate: 
>> ?template array_slice::array_slice(const vec&) 
>> [with T = tree_node*]?
>>2264 |   array_slice (const vec )
>> |   ^~~
>>   /home/mjambor/gcc/mine/src/gcc/vec.h:2264:3: note:   template argument 
>> deduction/substitution failed:
>>   /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:6693:36: note:   mismatched types 
>> ?va_heap? and ?va_gc?
>>6693 |   array_slice arr_slice (*heh);
>> |^
>> 
>>   [... I trimmed notes about all other candidates...]
>> 
>> Or did you mean something else?
>
> Hmm, so what if you change
>
>   template
>   array_slice (const vec )
> : m_base (v.address ()), m_size (v.length ()) {}
>
> to
>
>   template
>   array_slice (const vec )
> : m_base (v.address ()), m_size (v.length ()) {}
>
> instead?  Thus allow any allocation / placement template arg?
>

So being fully awake helps, the issue was of course in how I tested the
code, the above works fine and I can adapt my code to use that.

However, is it really preferable?

We often use NULL as to mean zero-length vector, which my code handled
gracefully:

+  template
+  array_slice (const vec *v)
+: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 0) {}

whereas using the generic method will mean that users constructing the
vector will have to special case it - and I bet most will end up using
the above sequence and the constructor from explicit pointer and size in
all constructors from gc vectors.

So, should I really change the patch and my code?

Thanks,

Martin


Re: [PATCH 1/2] vec: Add array_slice constructors from non-const and gc vectors

2022-08-29 Thread Martin Jambor
Hi,

On Mon, Aug 29 2022, Richard Biener wrote:
> On Fri, 26 Aug 2022, Martin Jambor wrote:
>
>> Hi,
>> 
>> On Fri, Aug 26 2022, Richard Biener wrote:
>> >> Am 26.08.2022 um 18:39 schrieb Martin Jambor :
>> >>
>> >> Hi,
>> >>
>> >> This patch adds constructors of array_slice that are required to
>> >> create them from non-const (heap or auto) vectors or from GC vectors.
>> >>
>> >> The use of non-const array_slices is somewhat limited, as creating one
>> >> from const vec still leads to array_slice,
>> >> so I eventually also only resorted to having read-only array_slices.
>> >> But I do need the constructor from the gc vector.
>> >>
>> >> Bootstrapped and tested along code that actually uses it on
>> >> x86_64-linux.  OK for trunk?
>> >>
>> >> Thanks,
>> >>
>> >> Martin
>> >>
>> >>
>> >> gcc/ChangeLog:
>> >>
>> >> 2022-08-08  Martin Jambor  
>> >>
>> >>* vec.h (array_slice): Add constructors for non-const reference to
>> >>heap vector and pointers to heap vectors.
>> >> ---
>> >> gcc/vec.h | 12 
>> >> 1 file changed, 12 insertions(+)
>> >>
>> >> diff --git a/gcc/vec.h b/gcc/vec.h
>> >> index eed075addc9..b0477e1044c 100644
>> >> --- a/gcc/vec.h
>> >> +++ b/gcc/vec.h
>> >> @@ -2264,6 +2264,18 @@ public:
>> >>   array_slice (const vec )
>> >> : m_base (v.address ()), m_size (v.length ()) {}
>> >>
>> >> +  template
>> >> +  array_slice (vec )
>> >> +: m_base (v.address ()), m_size (v.length ()) {}
>> >> +
>> >> +  template
>> >> +  array_slice (const vec *v)
>> >> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 
>> >> 0) {}
>> >> +
>> >> +  template
>> >> +  array_slice (vec *v)
>> >> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 
>> >> 0) {}
>> >> +
>> >
>> > I don?t quite understand why the generic ctor doesn?t cover the GC case.  
>> > It looks more like reference vs pointer?
>> >
>> 
>> If you think that this should work:
>> 
>>   vec *heh = cfun->local_decls;
>>   array_slice arr_slice (*heh);
>> 
>> then it does not:
>> 
>>   /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:6693:36: error: no matching 
>> function for call to ?array_slice::array_slice(vec> va_gc>&)?
>>6693 |   array_slice arr_slice (*heh);
>> |^
>>   In file included from /home/mjambor/gcc/mine/src/gcc/hash-table.h:248,
>>from /home/mjambor/gcc/mine/src/gcc/coretypes.h:486,
>>from /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:105:
>>   /home/mjambor/gcc/mine/src/gcc/vec.h:2264:3: note: candidate: 
>> ?template array_slice::array_slice(const vec&) 
>> [with T = tree_node*]?
>>2264 |   array_slice (const vec )
>> |   ^~~
>>   /home/mjambor/gcc/mine/src/gcc/vec.h:2264:3: note:   template argument 
>> deduction/substitution failed:
>>   /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:6693:36: note:   mismatched types 
>> ?va_heap? and ?va_gc?
>>6693 |   array_slice arr_slice (*heh);
>> |^
>> 
>>   [... I trimmed notes about all other candidates...]
>> 
>> Or did you mean something else?
>
> Hmm, so what if you change
>
>   template
>   array_slice (const vec )
> : m_base (v.address ()), m_size (v.length ()) {}
>
> to
>
>   template
>   array_slice (const vec )
> : m_base (v.address ()), m_size (v.length ()) {}
>
> instead?  Thus allow any allocation / placement template arg?

I tried this on Friday night too (but I was already only half awake) and
it led to some very weird self-test ICEs (and so I went to bed).

(I can try again but debugging such things is not quite what I wanted to
spend my time on :-)

Martin



Re: [PATCH 1/2] vec: Add array_slice constructors from non-const and gc vectors

2022-08-29 Thread Richard Biener via Gcc-patches
On Fri, 26 Aug 2022, Martin Jambor wrote:

> Hi,
> 
> On Fri, Aug 26 2022, Richard Biener wrote:
> >> Am 26.08.2022 um 18:39 schrieb Martin Jambor :
> >>
> >> Hi,
> >>
> >> This patch adds constructors of array_slice that are required to
> >> create them from non-const (heap or auto) vectors or from GC vectors.
> >>
> >> The use of non-const array_slices is somewhat limited, as creating one
> >> from const vec still leads to array_slice,
> >> so I eventually also only resorted to having read-only array_slices.
> >> But I do need the constructor from the gc vector.
> >>
> >> Bootstrapped and tested along code that actually uses it on
> >> x86_64-linux.  OK for trunk?
> >>
> >> Thanks,
> >>
> >> Martin
> >>
> >>
> >> gcc/ChangeLog:
> >>
> >> 2022-08-08  Martin Jambor  
> >>
> >>* vec.h (array_slice): Add constructors for non-const reference to
> >>heap vector and pointers to heap vectors.
> >> ---
> >> gcc/vec.h | 12 
> >> 1 file changed, 12 insertions(+)
> >>
> >> diff --git a/gcc/vec.h b/gcc/vec.h
> >> index eed075addc9..b0477e1044c 100644
> >> --- a/gcc/vec.h
> >> +++ b/gcc/vec.h
> >> @@ -2264,6 +2264,18 @@ public:
> >>   array_slice (const vec )
> >> : m_base (v.address ()), m_size (v.length ()) {}
> >>
> >> +  template
> >> +  array_slice (vec )
> >> +: m_base (v.address ()), m_size (v.length ()) {}
> >> +
> >> +  template
> >> +  array_slice (const vec *v)
> >> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 0) 
> >> {}
> >> +
> >> +  template
> >> +  array_slice (vec *v)
> >> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 0) 
> >> {}
> >> +
> >
> > I don?t quite understand why the generic ctor doesn?t cover the GC case.  
> > It looks more like reference vs pointer?
> >
> 
> If you think that this should work:
> 
>   vec *heh = cfun->local_decls;
>   array_slice arr_slice (*heh);
> 
> then it does not:
> 
>   /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:6693:36: error: no matching 
> function for call to ?array_slice::array_slice(vec va_gc>&)?
>6693 |   array_slice arr_slice (*heh);
> |^
>   In file included from /home/mjambor/gcc/mine/src/gcc/hash-table.h:248,
>from /home/mjambor/gcc/mine/src/gcc/coretypes.h:486,
>from /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:105:
>   /home/mjambor/gcc/mine/src/gcc/vec.h:2264:3: note: candidate: 
> ?template array_slice::array_slice(const vec&) [with 
> T = tree_node*]?
>2264 |   array_slice (const vec )
> |   ^~~
>   /home/mjambor/gcc/mine/src/gcc/vec.h:2264:3: note:   template argument 
> deduction/substitution failed:
>   /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:6693:36: note:   mismatched types 
> ?va_heap? and ?va_gc?
>6693 |   array_slice arr_slice (*heh);
> |^
> 
>   [... I trimmed notes about all other candidates...]
> 
> Or did you mean something else?

Hmm, so what if you change

  template
  array_slice (const vec )
: m_base (v.address ()), m_size (v.length ()) {}

to

  template
  array_slice (const vec )
: m_base (v.address ()), m_size (v.length ()) {}

instead?  Thus allow any allocation / placement template arg?

Richard.

> Thanks,
> 
> Martin
> 

-- 
Richard Biener 
SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg,
Germany; GF: Ivo Totev, Andrew Myers, Andrew McDonald, Boudien Moerman;
HRB 36809 (AG Nuernberg)


Re: [PATCH 1/2] vec: Add array_slice constructors from non-const and gc vectors

2022-08-26 Thread Martin Jambor
Hi,

On Fri, Aug 26 2022, Richard Biener wrote:
>> Am 26.08.2022 um 18:39 schrieb Martin Jambor :
>>
>> Hi,
>>
>> This patch adds constructors of array_slice that are required to
>> create them from non-const (heap or auto) vectors or from GC vectors.
>>
>> The use of non-const array_slices is somewhat limited, as creating one
>> from const vec still leads to array_slice,
>> so I eventually also only resorted to having read-only array_slices.
>> But I do need the constructor from the gc vector.
>>
>> Bootstrapped and tested along code that actually uses it on
>> x86_64-linux.  OK for trunk?
>>
>> Thanks,
>>
>> Martin
>>
>>
>> gcc/ChangeLog:
>>
>> 2022-08-08  Martin Jambor  
>>
>>* vec.h (array_slice): Add constructors for non-const reference to
>>heap vector and pointers to heap vectors.
>> ---
>> gcc/vec.h | 12 
>> 1 file changed, 12 insertions(+)
>>
>> diff --git a/gcc/vec.h b/gcc/vec.h
>> index eed075addc9..b0477e1044c 100644
>> --- a/gcc/vec.h
>> +++ b/gcc/vec.h
>> @@ -2264,6 +2264,18 @@ public:
>>   array_slice (const vec )
>> : m_base (v.address ()), m_size (v.length ()) {}
>>
>> +  template
>> +  array_slice (vec )
>> +: m_base (v.address ()), m_size (v.length ()) {}
>> +
>> +  template
>> +  array_slice (const vec *v)
>> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 0) {}
>> +
>> +  template
>> +  array_slice (vec *v)
>> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 0) {}
>> +
>
> I don’t quite understand why the generic ctor doesn’t cover the GC case.  It 
> looks more like reference vs pointer?
>

If you think that this should work:

  vec *heh = cfun->local_decls;
  array_slice arr_slice (*heh);

then it does not:

  /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:6693:36: error: no matching function 
for call to ‘array_slice::array_slice(vec&)’
   6693 |   array_slice arr_slice (*heh);
|^
  In file included from /home/mjambor/gcc/mine/src/gcc/hash-table.h:248,
   from /home/mjambor/gcc/mine/src/gcc/coretypes.h:486,
   from /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:105:
  /home/mjambor/gcc/mine/src/gcc/vec.h:2264:3: note: candidate: ‘template array_slice::array_slice(const vec&) [with T = tree_node*]’
   2264 |   array_slice (const vec )
|   ^~~
  /home/mjambor/gcc/mine/src/gcc/vec.h:2264:3: note:   template argument 
deduction/substitution failed:
  /home/mjambor/gcc/mine/src/gcc/ipa-cp.cc:6693:36: note:   mismatched types 
‘va_heap’ and ‘va_gc’
   6693 |   array_slice arr_slice (*heh);
|^

  [... I trimmed notes about all other candidates...]

Or did you mean something else?

Thanks,

Martin


Re: [PATCH 1/2] vec: Add array_slice constructors from non-const and gc vectors

2022-08-26 Thread Richard Biener via Gcc-patches



> Am 26.08.2022 um 18:39 schrieb Martin Jambor :
> 
> Hi,
> 
> This patch adds constructors of array_slice that are required to
> create them from non-const (heap or auto) vectors or from GC vectors.
> 
> The use of non-const array_slices is somewhat limited, as creating one
> from const vec still leads to array_slice,
> so I eventually also only resorted to having read-only array_slices.
> But I do need the constructor from the gc vector.
> 
> Bootstrapped and tested along code that actually uses it on
> x86_64-linux.  OK for trunk?
> 
> Thanks,
> 
> Martin
> 
> 
> gcc/ChangeLog:
> 
> 2022-08-08  Martin Jambor  
> 
>* vec.h (array_slice): Add constructors for non-const reference to
>heap vector and pointers to heap vectors.
> ---
> gcc/vec.h | 12 
> 1 file changed, 12 insertions(+)
> 
> diff --git a/gcc/vec.h b/gcc/vec.h
> index eed075addc9..b0477e1044c 100644
> --- a/gcc/vec.h
> +++ b/gcc/vec.h
> @@ -2264,6 +2264,18 @@ public:
>   array_slice (const vec )
> : m_base (v.address ()), m_size (v.length ()) {}
> 
> +  template
> +  array_slice (vec )
> +: m_base (v.address ()), m_size (v.length ()) {}
> +
> +  template
> +  array_slice (const vec *v)
> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 0) {}
> +
> +  template
> +  array_slice (vec *v)
> +: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 0) {}
> +

I don’t quite understand why the generic ctor doesn’t cover the GC case.  It 
looks more like reference vs pointer?

>   iterator begin () { return m_base; }
>   iterator end () { return m_base + m_size; }
> 
> -- 
> 2.37.2
> 


[PATCH 1/2] vec: Add array_slice constructors from non-const and gc vectors

2022-08-26 Thread Martin Jambor
Hi,

This patch adds constructors of array_slice that are required to
create them from non-const (heap or auto) vectors or from GC vectors.

The use of non-const array_slices is somewhat limited, as creating one
from const vec still leads to array_slice,
so I eventually also only resorted to having read-only array_slices.
But I do need the constructor from the gc vector.

Bootstrapped and tested along code that actually uses it on
x86_64-linux.  OK for trunk?

Thanks,

Martin


gcc/ChangeLog:

2022-08-08  Martin Jambor  

* vec.h (array_slice): Add constructors for non-const reference to
heap vector and pointers to heap vectors.
---
 gcc/vec.h | 12 
 1 file changed, 12 insertions(+)

diff --git a/gcc/vec.h b/gcc/vec.h
index eed075addc9..b0477e1044c 100644
--- a/gcc/vec.h
+++ b/gcc/vec.h
@@ -2264,6 +2264,18 @@ public:
   array_slice (const vec )
 : m_base (v.address ()), m_size (v.length ()) {}
 
+  template
+  array_slice (vec )
+: m_base (v.address ()), m_size (v.length ()) {}
+
+  template
+  array_slice (const vec *v)
+: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 0) {}
+
+  template
+  array_slice (vec *v)
+: m_base (v ? v->address () : nullptr), m_size (v ? v->length () : 0) {}
+
   iterator begin () { return m_base; }
   iterator end () { return m_base + m_size; }
 
-- 
2.37.2