<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style type="text/css" style="display:none;"><!-- P {margin-top:0;margin-bottom:0;} --></style>
</head>
<body dir="ltr">
<div id="divtagdefaultwrapper" style="font-size: 12pt; color: rgb(0, 0, 0); font-family: Calibri, Helvetica, sans-serif, "EmojiFont", "Apple Color Emoji", "Segoe UI Emoji", NotoColorEmoji, "Segoe UI Symbol", "Android Emoji", EmojiSymbols;" dir="ltr">
<p style="margin-top:0;margin-bottom:0"><font size="2"><span style="font-size:11pt;"><font size="2"><span style="font-size:11pt;">> There's nothing wrong with the type representation, it's simply that the C/C++ behavior cannot actually be captured with the
 superspace model.</span></font> > In the current C/C++ model, the default behavior for address space conversions is that converting between any two address spaces implicitly is > always prohibited, but converting explicitly is always permitted. This cannot
 be expressed in the superspace model, as there is no way to make > explicit conversion between AS1 and AS2 legal without also either making AS1->AS2 or AS2->AS1 implicitly legal, as  'isAddressSpaceOverlapping' is dependent on 'isAddressSpaceSuperSpaceOf'.
<br>
</span></font></p>
<p style="margin-top:0;margin-bottom:0"><font size="2"><span style="font-size:11pt;"><br>
</span></font></p>
<p style="margin-top:0;margin-bottom:0">I thought that this is because the address space support is incomplete. At least according to the embedded C report the casts to non-overlapping address spaces should be disallowed. It doesn't clarify however whether
 it applies to both implicit and explicit cast.</p>
<p style="margin-top:0;margin-bottom:0"><br>
</p>
<p style="margin-top:0;margin-bottom:0"><font size="2"><span style="font-size:11pt;">> If it requires hardware or backend support it doesn't really feel like a logical concept any more. The overhead of the runtime checking also sounds a bit scary. I think that
 if a target or language supports a generic address space, then they can use that for methods if they want to save on the typing overhead. Otherwise I think they'll just have to wait until there is a way to automatically deduce address space qualified member
 functions at compile time.</span></font></p>
<p style="margin-top:0;margin-bottom:0"><font size="2"><span style="font-size:11pt;"><br>
</span></font></p>
<p style="margin-top:0;margin-bottom:0"><font size="2"><span style="font-size:11pt;">I think that the deduction won't help here because we would like the member functions to be called on objects in different address spaces, at least for the general case. And
 then we end up with truly generic cases where multiple address spaces are to be used with the method on the place of generic. There are multiple ways to solve this problem including duplicating the methods but they don't seem to be ideal. I feel that the address
 space support for C++ without something like generic address space can't be complete. I will start a separate RFC summarizing my thoughts with a few examples perhaps to avoid diverging the focus of this RFC.</span></font></p>
<p style="margin-top:0;margin-bottom:0"><font size="2"><span style="font-size:11pt;"><br>
</span></font></p>
<p style="margin-top:0;margin-bottom:0"><font size="2"><span style="font-size:11pt;">Thanks!</span></font></p>
<p style="margin-top:0;margin-bottom:0"><font size="2"><span style="font-size:11pt;">Anastasia</span></font><br>
</p>
<br>
<br>
<div style="color: rgb(0, 0, 0);">
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" face="Calibri, sans-serif" color="#000000"><b>From:</b> Bevin Hansson <bevin.hansson@ericsson.com><br>
<b>Sent:</b> 26 March 2019 18:18<br>
<b>To:</b> Anastasia Stulova; clang-dev developer list<br>
<b>Cc:</b> nd<br>
<b>Subject:</b> Re: [RFC] Improved address space conversion semantics for targets and language dialects</font>
<div> </div>
</div>
<div dir="ltr">
<div id="x_divtagdefaultwrapper" dir="ltr" style="font-size:12pt; color:rgb(0,0,0); font-family:Calibri,Helvetica,sans-serif,"EmojiFont","Apple Color Emoji","Segoe UI Emoji",NotoColorEmoji,"Segoe UI Symbol","Android Emoji",EmojiSymbols">
<br>
<div style="color:rgb(0,0,0)">
<div class="x_BodyFragment"><font size="2"><span style="font-size:11pt">
<div class="x_PlainText"><br>
> Yes, I believe we might not have any upstream example for this and<br>
> hence current implementation is not complete. However, the current<br>
> approach has some sort of the guidelines on how the ambiguity can<br>
> be resolved that we would need to figure out with the new logic.<br>
<br>
> I guess we could use the implicit/explicit conversion for this, however<br>
> it might become more convoluted.<br>
<br>
Well, if we do change the interface to model conversion legality instead of superspaces, the functional behavior can be the same as today. We would just call the proper method for checking implicit AS conversion as we call isAddressSpaceSupersetOf today. However,
 if we decide to change the overload behavior to consider shorter AS conversion paths over longer ones, the intuition might not be as obvious as it would be with the superspace approach.<br>
<br>
> I think there might be a little bit of that. For the developers from embedded<br>
> C or OpenCL background this concept is quite familiar. And one advantage<br>
> is that there is some sort of the spec that regulates the logic. I do find your<br>
> logic quite intuitive and for C++  at least we can definitely make bigger<br>
> changes. However, it also helps to build on top of something that already<br>
> works. I am only worried about covering the corner cases enough.<br>
<br>
> May be prototyping the solution you are suggesting is a good way forward.<br>
<br>
Yes, prototyping it is probably a good idea, at least to get an idea of how it could look in practice.<br>
<br>
<br>
> But this logic comes from C/C++, generally speaking I can't think of the case<br>
> where implicit conversion would be allowed between the types that won't be <br>
> explicitly convertible. I don't think there is anything OpenCL specific about this.<br>
> I think address space conversion logic is pretty much extending qualifiers in<br>
> C/C++. Do you think there is any use case that needs different logic? Then<br>
> perhaps we will have more work to do because qualifiers might not be the right<br>
> fit for the address spaces with such logic.<br>
<br>
<font size="2"><span style="font-size:11pt">There's nothing wrong with the type representation, it's simply that the C/C++ behavior cannot actually be captured with the superspace model.</span></font> In the current C/C++ model, the default behavior for address
 space conversions is that converting between any two address spaces implicitly is always prohibited, but converting explicitly is always permitted. This cannot be expressed in the superspace model, as there is no way to make explicit conversion between AS1
 and AS2 legal without also either making AS1->AS2 or AS2->AS1 implicitly legal, as 'isAddressSpaceOverlapping' is dependent on 'isAddressSpaceSuperSpaceOf'. This is the reason why the conversion logic in checkAddressSpaceCast is hidden behind the OpenCL option,
 for example.<br>
<br>
<br>
> Generic AS would have to be preserved in the LLVM IR too and then it can<br>
> be lowered by the backed. The best solution would be to add some special HW<br>
> support to allow translating address spaces efficiently. However it can be<br>
> emulated by the compiler but then a toolchain should provide some way to<br>
> detect in what specific AS an object in generic AS points to. This can be done<br>
> by adding special intrinsics. However this checks are quite costly. There is some<br>
> help for reducing the overheads of generic address space provided in LLVM already<br>
> in form of a special pass that allows to infer the specific address space where<br>
> applicable.<br>
<br>
If it requires hardware or backend support it doesn't really feel like a logical concept any more. The overhead of the runtime checking also sounds a bit scary. I think that if a target or language supports a generic address space, then they can use that for
 methods if they want to save on the typing overhead. Otherwise I think they'll just have to wait until there is a way to automatically deduce address space qualified member functions at compile time.<br>
<br>
<br>
</div>
</span></font></div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>