[LLVMdev] Is address space 1 reserved?
Philip Reames
listmail at philipreames.com
Wed Jan 7 14:17:36 PST 2015
On 01/07/2015 02:15 PM, Pete Cooper wrote:
>
>> On Jan 7, 2015, at 2:10 PM, Philip Reames <listmail at philipreames.com
>> <mailto:listmail at philipreames.com>> wrote:
>>
>>
>> On 01/07/2015 12:17 PM, Pete Cooper wrote:
>>>
>>>> On Jan 7, 2015, at 12:05 PM, Matt Arsenault <arsenm2 at gmail.com
>>>> <mailto:arsenm2 at gmail.com>> wrote:
>>>>
>>>>
>>>>> On Jan 7, 2015, at 2:55 PM, Philip Reames
>>>>> <listmail at philipreames.com <mailto:listmail at philipreames.com>> wrote:
>>>>>
>>>>>
>>>>> On 01/07/2015 11:52 AM, Matt Arsenault wrote:
>>>>>>
>>>>>>> On Jan 7, 2015, at 2:25 PM, Owen Anderson <resistor at mac.com
>>>>>>> <mailto:resistor at mac.com>> wrote:
>>>>>>>
>>>>>>> I'm not aware of any such restriction, and I know of several
>>>>>>> LLVM based systems that use address space 1 for something other
>>>>>>> than that.
>>>>>>>
>>>>>>> -Owen
>>>>>>
>>>>>> Yes, this would be a problem for us. We use 1 for a normal
>>>>>> address space where 0 is invalid. However, we also have a problem
>>>>>> where some other address spaces do want 0 to be a valid address,
>>>>>> which just sort of don’t work correctly now.
>>>>> If you have an example with a null in a non-0 address space being
>>>>> mishandled, please file a bug. We'll fix them as we find them.
>>>>
>>>> I think the problems aren’t so much that accessing 0 doesn’t work
>>>> (although I imagine there are problems with that), but expectations
>>>> of comparison with null. The main problem I’m aware of is
>>>> comparisons with null pointers. The first global object in
>>>> addrspace(3) will have the address of 0, so if a user does if (x !=
>>>> NULL), it will not behave as expected. For C I think this is
>>>> supposed to be fixed by changing the value of NULL to -1, but I
>>>> don’t think that is currently supported. That is also complicated
>>>> because the null value is different for different address spaces,
>>>> and I think the actual null pointer value must be 0 for C++. It
>>>> doesn’t really turn up often in real code so I don’t think anybody
>>>> has really spent time thinking about how to properly solve this.
>>> Actually, we had a similar discussion a while ago about this:
>>> http://lists.cs.uiuc.edu/pipermail/llvmdev/2013-August/064624.html
>>>
>>> In the link I gave, I proposed using global metadata to describe
>>> address spaces. Its useful, for example, to know that an address
>>> space is always to constant memory, i.e., the CL model.
>>>
>>> I think later in the conversation we also thought about defining the
>>> relationships between address spaces in a similar method to tbaa on
>>> types. Then you could do address space AA.
>> I'm a bit hesitant* to do this with metadata. At least to start
>> with, these seem like backend specific properties. Why not introduce
>> some hooks into Target or Subtarget with the appropriate queries?
>>
>> * Reasons for hesitancy:
>> - Not sure these are purely optimizations - is dropping always legal?
> It would be global metadata so can’t be dropped (or just isn’t right
> now so its ok anyway)
>> - How do we merge such things in LTO?
> Thats a good point.
>> - Forward serialization? It might be better to define the properties
>> better than design a reasonable scheme.
> As is that.
>
> I think at the time I proposed metadata we didn’t have TTI or anything
> else similar. I would be happy to say that things like null ptr deref
> are defined only for address space 0, and all other address spaces can
> only be optimised if TTI supports it. This means no TTI would default
> to not optimizing anything other than address space 0 which I think is
> good.
>
> You could also move all of the checks to TTI and define that NoTTI
> gives an answer for address space 0 and ignores all others. Then you
> can just query TTI everywhere instead of special casing address space
> 0 everywhere.
Either approach sounds fine; I have no opinion. Volunteers? :)
>
> Pete
>>>
>>> Pete
>>>>
>>>> -Matt
>>>>
>>>>
>>>>>>
>>>>>> -Matt
>>>>>>
>>>>>>
>>>>>>
>>>>>>>
>>>>>>> On Jan 7, 2015, at 1:18 PM, Philip Reames
>>>>>>> <listmail at philipreames.com <mailto:listmail at philipreames.com>>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> On the review for http://reviews.llvm.org/D6808, majnemer
>>>>>>>> <http://reviews.llvm.org/p/majnemer/> commented that:
>>>>>>>> "Address space 1 has a special meaning in LLVM, it's identical
>>>>>>>> to address space 0 except for the fact that "null" may be
>>>>>>>> dereferenced. You might want to consider a different address
>>>>>>>> space."
>>>>>>>>
>>>>>>>> This is the first I've heard of this and I can't find any
>>>>>>>> documentation about it being reserved, either in general, or
>>>>>>>> specifically for x86. Can anyone clarify?
>>>>>>>>
>>>>>>>> The only address spaces with special meanings I know of are:
>>>>>>>> - 0 (the normal address space, null is not dereferencable)
>>>>>>>> - 256 - TLS, GS relative addressing
>>>>>>>> - 257 - FS relative addressing
>>>>>>>>
>>>>>>>> Philip
>>>>>>>> _______________________________________________
>>>>>>>> LLVM Developers mailing list
>>>>>>>> LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
>>>>>>>> http://llvm.cs.uiuc.edu <http://llvm.cs.uiuc.edu/>
>>>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>>>>> _______________________________________________
>>>>>>> LLVM Developers mailing list
>>>>>>> LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
>>>>>>> http://llvm.cs.uiuc.edu <http://llvm.cs.uiuc.edu/>
>>>>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
>>>> http://llvm.cs.uiuc.edu <http://llvm.cs.uiuc.edu/>
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150107/35ee11ec/attachment.html>
More information about the llvm-dev
mailing list