ebevhan added a comment.

In D62574#1523835 <https://reviews.llvm.org/D62574#1523835>, @Anastasia wrote:

> > This patch does not address the issue with the accessors
> >  on Qualifiers (isAddressSpaceSupersetOf, compatiblyIncludes),
> >  because I don't know how to solve it without breaking a ton of
> >  rather nice encapsulation. Either, every mention of compatiblyIncludes
> >  must be replaced with a call to a corresponding ASTContext method,
> >  Qualifiers must have a handle to ASTContext, or ASTContext must be
> >  passed to every such call. This revision mentions the issue in a comment:
> >  https://reviews.llvm.org/D49294
>
> I think using ASTContext helper is ok then.


Alright. Just to clarify, you mean the first option (using a new accessor on 
ASTContext and replacing all existing compatiblyIncludes with that)?

I'll have to see if that's possible without breaking a few more interfaces, 
since you can throw around Qualifiers and check for compatibility without an 
ASTContext today.

> I was just thinking about testing the new logic. Should we add something like 
>  `-ffake-address-space-map` 
> (https://clang.llvm.org/docs/UsersManual.html#opencl-specific-options) that 
> will force targets to use some implementation of fake address space 
> conversions? It was quite useful in OpenCL before we added concrete targets 
> with address spaces. Alternatively, we can try to use SPIR that is a generic 
> Clang-only target that has address spaces.

Well, there are a couple targets which have target address spaces even today, I 
think. AMDGPU should be one, right?

I forgot to mention; this patch also disables two "extensions" that Clang has, 
namely that subtraction and comparison on pointers of different address spaces 
is legal regardless of address space compatibility. I'm pretty sure that these 
extensions only exist because Clang hasn't had support for targets to express 
address space compatibility until now. According to the docs, x86 uses address 
spaces for certain types of segment access: 
https://clang.llvm.org/docs/LanguageExtensions.html#memory-references-to-specified-segments

If x86 (or any target that uses target address spaces) wants to keep using this 
and still keep such pointers implicitly compatible with each other, it will 
need to configure this in its target hooks.



================
Comment at: lib/Sema/SemaOverload.cpp:3171
+  // qualification conversion for disjoint address spaces make address space
+  // casts *work*?
   Qualifiers FromQuals = FromType.getQualifiers();
----------------
Anastasia wrote:
> I guess if address spaces don't overlap we don't have a valid qualification 
> conversion. This seems to align with the logic for cv. My guess is that none 
> of the other conversions will be valid for non overlapping address spaces and 
> the error will occur.
> 
> I think at this point we might not need to know if it's implicit or explicit? 
> I believe we might have a separate check for this somewhere because it works 
> for OpenCL. I don't know though if it might simplify the flow if we move this 
> logic rather here.
> 
> The cv checks above seem to use `CStyle` flag. I am wondering if we could use 
> it to detect implicit or explicit. Because we can only cast address space 
> with C style cast at the moment.  Although after adding `addrspace_cast` 
> operator that will no longer be the only way.
> I guess if address spaces don't overlap we don't have a valid qualification 
> conversion. This seems to align with the logic for cv. My guess is that none 
> of the other conversions will be valid for non overlapping address spaces and 
> the error will occur.

Right. So the reasoning is that if the address spaces are disjoint according to 
the overlap rule, then it cannot be considered a qualification conversion.

But with the new hooks, it's possible for a target to allow explicit conversion 
even if address spaces do not overlap according to the rules. So even though 
there is no overlap, such a conversion could still be a qualification 
conversion if it was explicit (either via a c-style cast or an 
`addrspace_cast`). This is in fact the default for all targets (see the patch 
in TargetInfo.h).

I think I need a refresher on how the casts were meant to work; were both 
`static_cast` and `reinterpret_cast` supposed to be capable of implicit 
conversion (say, private -> generic) but only `addrspace_cast` for the other 
direction (generic -> private)? Or was `reinterpret_cast` supposed to fail in 
the first case?


================
Comment at: lib/Sema/SemaOverload.cpp:5150
 
+  // FIXME: hasAddressSpace is wrong; this check will be skipped if FromType is
+  // not qualified with an address space, but if there's no implicit conversion
----------------
Anastasia wrote:
> Agree! We need to check that address spaces are not identical and then 
> validity!
> 
> But I guess it's ok for C++ because we can't add addr space qualifier to 
> implicit object parameter yet?
> 
> It's broken for OpenCL though!
> But I guess it's ok for C++ because we can't add addr space qualifier to 
> implicit object parameter yet?

True, but that will become possible eventually.

I'm not sure if this is currently an issue with OpenCL as it is either. It's 
only a problem if FromType is not qualified, but is that possible? Even the 
'notational' non-AS-qualification in OpenCL is still a qualification under the 
hood (either private or generic). Or maybe I'm misunderstanding how it works.


Repository:
  rC Clang

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

https://reviews.llvm.org/D62574



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

Reply via email to