Anastasia added inline comments.

================
Comment at: lib/Sema/SemaExprCXX.cpp:4289
+                             /*BasePath=*/nullptr, CCK)
+               .get();
 
----------------
rjmccall wrote:
> Anastasia wrote:
> > rjmccall wrote:
> > > Anastasia wrote:
> > > > rjmccall wrote:
> > > > > Okay.  But if `ToType` *isn't* a reference type, this will never be 
> > > > > an address-space conversion.  I feel like this code could be written 
> > > > > more clearly to express what it's trying to do.
> > > > I hope it makes more sense now. Btw, it also applies to pointer type.
> > > The logic is wrong for pointer types; if you're converting pointers, you 
> > > need to be checking the address space of the pointee type of the from 
> > > type.
> > > 
> > > It sounds like this is totally inadequately tested; please flesh out the 
> > > test with all of these cases.  While you're at it, please ensure that 
> > > there are tests verifying that we don't allowing address-space changes in 
> > > nested positions.
> > Thanks for spotting this bug! The generated IR for the test was still 
> > correct because AS of `FromType` happened to correctly mismatch AS of 
> > pointee of `ToType`.
> > 
> > I failed to construct the test case where it would miss classifying 
> > `addrspacecast` due to OpenCL or C++ sema rules but I managed to add a case 
> > in which `addrspacecast` was incorrectly added for pointers where it wasn't 
> > needed (see line 36 of the test). I think this code is covered now.
> > 
> > As for the address space position in pointers, the following test checks 
> > the address spaces of pointers in `addrspacecast`. For the other program 
> > paths we also have a test with similar checks in 
> > `test/CodeGenOpenCL/address-spaces-conversions.cl` that we now run for C++ 
> > mode too.
> > 
> > BTW, while trying to construct a test case for the bug, I have discovered 
> > that multiple pointer indirection casting isn't working correctly. I.e. for 
> > the following program:
> >   kernel void foo(){
> >      __private int** loc;
> >      int** loc_p = loc;
> >      **loc_p = 1;
> >   }
> > We generate:
> >   bitcast i32* addrspace(4)* %0 to i32 addrspace(4)* addrspace(4)*
> > in OpenCL C and then perform `store` over pointer in AS 4 (generic). We 
> > have now lost the information that the original pointer was in `private` AS 
> > and that the adjustment of AS segment has to be performed before accessing 
> > memory pointed by the pointer. Based on the current specification of 
> > `addrspacecast` in 
> > https://llvm.org/docs/LangRef.html#addrspacecast-to-instruction I am not 
> > very clear whether it can be used for this case without any modifications 
> > or clarifications and also what would happen if there are multiple AS 
> > mismatches. I am going to look at this issue separately in more details. In 
> > OpenCL C++ an ICE is triggered for this though. Let me know if you have any 
> > thoughts on this.
> Thanks, the check looks good now.
> 
> > BTW, while trying to construct a test case for the bug, I have discovered 
> > that multiple pointer indirection casting isn't working correctly.
> 
> This needs to be an error in Sema.  The only qualification conversions that 
> should be allowed in general on nested pointers (i.e. on `T` in `T**` or 
> `T*&`) are the basic C qualifiers: `const`, `volatile`, and `restrict`; any 
> other qualification change there is unsound.
I see. I guess it's because C++ rules don't cover address spaces.

It feels like it would be a regression for OpenCL C++ vs OpenCL C to reject 
nested pointers with address spaces because it was allowed before. :(

However, the generation for OpenCL C and C are incorrect currently. I will try 
to sort that all out as a separate patch though, if it makes sense? 


https://reviews.llvm.org/D53764



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

Reply via email to