Anastasia added a comment.

In D69938#1745766 <https://reviews.llvm.org/D69938#1745766>, @rjmccall wrote:

> In D69938#1745737 <https://reviews.llvm.org/D69938#1745737>, @Anastasia wrote:
>
> > In D69938#1742354 <https://reviews.llvm.org/D69938#1742354>, @rjmccall 
> > wrote:
> >
> > > In D69938#1742026 <https://reviews.llvm.org/D69938#1742026>, @Anastasia 
> > > wrote:
> > >
> > > > In D69938#1741713 <https://reviews.llvm.org/D69938#1741713>, @rjmccall 
> > > > wrote:
> > > >
> > > > > In D69938#1741080 <https://reviews.llvm.org/D69938#1741080>, 
> > > > > @Anastasia wrote:
> > > > >
> > > > > > In D69938#1737196 <https://reviews.llvm.org/D69938#1737196>, 
> > > > > > @rjmccall wrote:
> > > > > >
> > > > > > > It does make logical sense to be able to qualify the call 
> > > > > > > operator of a lambda.  The lambda always starts as a temporary, 
> > > > > > > so presumably we want the default address space qualifier on 
> > > > > > > lambdas to be compatible with the address space of temporaries.  
> > > > > > > However, that's probably also true of the default address 
> > > > > > > qualifier on methods in general or you wouldn't be able to call 
> > > > > > > them on temporaries and locals.  Thus, we should be able to use 
> > > > > > > the same default in both cases, which seems to be what you've 
> > > > > > > implemented.
> > > > > > >
> > > > > > > It even makes sense to be able to qualify a lambda with an 
> > > > > > > address space that's not compatible with the address space of 
> > > > > > > temporaries; that just means that the lambda has to be copied 
> > > > > > > elsewhere before it can be invoked.
> > > > > >
> > > > > >
> > > > > > Just to clarify... Do you mean we should be able to compile this 
> > > > > > example:
> > > > > >
> > > > > >   [&] __global {
> > > > > >         i++;
> > > > > >   } ();
> > > > > >   
> > > > > >   
> > > > > >
> > > > > > Or should this result in a diagnostic about an addr space mismatch?
> > > > >
> > > > >
> > > > > It should result in a diagnostic on the call.  But if you assigned 
> > > > > that lambda into global memory (somehow) it should work.
> > > >
> > > >
> > > > Ok, makes sense so something like this should compile fine:
> > > >
> > > >   __global auto glob = [&] __global { ... };
> > >
> > >
> > > Right, a call to `glob()` should work in this case.  I don't know if 
> > > `__global` would parse here without `()`, though; in the grammar, it 
> > > looks like attributes and so on have to follow an explicit parameter 
> > > clause.
> > >
> > > >>> 3. Diagnose address space mismatch between variable decl and lambda 
> > > >>> expr qualifier Example: __private auto  llambda = [&]() __local 
> > > >>> {i++;}; // error no legal conversion b/w __private and __local
> > > >>> 
> > > >>>   I think 1 is covered by this patch. I would like to implement 2 as 
> > > >>> a separate patch though to be able to commit fix for 1 earlier and 
> > > >>> unblock some developers waiting for the fix. I think 3 already works 
> > > >>> and I will just update the diagnostic in a separate patch too.
> > > >> 
> > > >> I agree that 3 should just fall out.  And yeah, implementing 2 as a 
> > > >> separate patch should be fine.  Please make sure 3 is adequately 
> > > >> tested in this patch.
> > > > 
> > > > Ok, since we can't qualify lambda expr with addr spaces yet there is 
> > > > not much I can test at this point. `__constant` lambda variable seems 
> > > > to be the only case with a diagnostic for OpenCL.
> > >
> > > You can certainly copy a lambda type into a different address space, or 
> > > construct a pointer to a qualified lambda type, e.g. `(*(__constant 
> > > decltype(somelambda) *) nullptr)()`.
> >
> >
> > Perhaps I am not thinking of the right use cases, but I am struggling to 
> > understand what would be the difference to variables of other type here.
> >
> > I have added `(*(__constant decltype(somelambda) *) nullptr)()` as a test 
> > case however. It is rejected due to multiple addr spaces.
>
>
> Hmm.  That makes sense — `decltype` is picking up the address-space 
> qualification of `somelambda` — but seems unfortunate; is the only way to 
> change the address space of a type to specifically strip the address space 
> with a template metaprogram?


I can't think of any other way. The main reason is that in OpenCL we add 
address spaces implicitly to all objects if they are not specified. Unless we 
decide to modify `decltype`  but I think in other places it is useful to copy 
addr space qualifier too. For C++ however it might work, I will look into it.

> I would hope that the multiple-address-spaces error would only apply in the 
> case of multiple explicit qualifiers, and otherwise the new address space 
> qualifier would replace the old one.  I won't ask you to do that just to do 
> this patch, but you could write the template metaprogram:
> 
>   template <class T> struct remove_address_space { using type = T; };
>   template <class T> struct remove_address_space<__private T> { using type = 
> T; };
>   ...
>   auto globalLambdaPtr = (__global 
> remove_address_space<decltype(somelambda)>::type*) nullptr;
>   globalLambdaPtr();
>    

I was already planning to add this. I could look into it next and maybe just a 
add FIXME in the test for now.

>> Also generally do you think there is any situation in which having lambda 
>> object and lambda call operator in different addr spaces would be useful?
> 
> Absolutely; remember that all lambda objects begin their life as temporaries 
> and are thus in the private address space, so if you want the lambda to be 
> storable in any other address space you will have at least a brief mismatch.  
> The user can address-space-qualify the lambda all they want, but we can't 
> generally automatically allocate memory for it that address space.

Btw global lambda objects are in `__global` address space in OpenCL.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D69938/new/

https://reviews.llvm.org/D69938



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to