PR17925, PATCH
Nick Lewycky
nicholas at mxc.ca
Sun Nov 24 23:23:26 PST 2013
Stepan Dyatkovskiy wrote:
> New patch.
>
> In respect to last Nick's remarks:
> http://llvm.org/bugs/show_bug.cgi?id=17925#c2
>
> I made only addrspace(0) equal to integer type by default. I also have
> added few fixmes, in which I propose to ask target whether we can ignore
> address space and treat all pointers as integers.
>
> I have removed inttoptr-address-space-2.ll, since it would be incorrect
> after these changes. This test wants to merge function with different
> return types.
This sounds fine in concept.
Looking at the patch, I would have left out the PtrAsInt stuff for a
future patch. Right now it's all dead code and we don't add dead code to
LLVM.
I'm also concerned that the PtrAsInt stuff is wrong. The test is written
like so:
+ if (TD) {
+ if (PTy1 && (PTy1->getAddressSpace() == 0 || PtrAsInt))
+ Ty1 = TD->getIntPtrType(Ty1);
That's not how address spaces work, we'll never have a situation where
it's safe to say "all address spaces with the same pointer width are the
same". You may have a situation where address spaces 1, 2, 3 and 4 are
all i64-sized pointers, but 1 and 2 overlap with each other, and 3 and 4
overlap with each other, but that's it.
Even if they did overlap, it's not clear to me that an 'inttoptr i64
1234 to i64 addrspace(1)*' and 'inttoptr i64 1234 to i64 addrspace(2)*'
would actually map to the same pointer.
As for address space zero, it's special and magical being the address
space which both alloca() and malloc()/free() use. There will always be
an exception for address space zero (put another way, if anybody wants
to change that they'll have to do an enormous reworking of llvm such
that changing mergefunc will be the least of their problems).
It looks like LLVM doesn't yet have any way to represent the
relationship between address spaces, but it's supposed to look similar
to the same thing from Embedded C. (I forget whether Embedded C permits
mapping vectors-of-4 to vector-of-3, but LLVM intends to allow this. For
instance, in addrspace(1) we have memory laid out in '<X,Y,Z>, <X,Y,Z>
...' but in addrspace(2) the same memory appears to laid out in
'<X,Y,Z,1>, <X,Y,Z,1> ...'. This feature is intended for sharing memory
between CPU and GPU.)
To quote the Embedded C standard, "Typically, the distinction between
various address spaces is built into the processor's instruction set,
with accesses to different spaces requiring distinctly different
instructions." It's important that functions which would use different
instructions don't get merged by mergefunc.
All that said, this part of the patch is disabled anyways, and
everything else about this patch looks good!
Nick
>
> -Stepan
>
> Stepan Dyatkovskiy wrote:
>> ping
>> Stepan Dyatkovskiy wrote:
>>> I have updated fix:
>>> Introduced exceptions for
>>> * 'ret' instruction (we can ignore address space here)
>>> * 'load' instruction (we can't ignore address space in operands, but
>>> it we still can do it for instruction type itself)
>>>
>>> Now all tests are passed.
>>>
>>> -Stepan
>>>
>>> 14.11.2013, 16:38, "Stepan Dyatkovskiy" <stpworld at narod.ru>:
>>>> Please find bug description at:
>>>> http://llvm.org/bugs/show_bug.cgi?id=17925
>>>>
>>>> Sorry, I forget, that fixes should be published in llvm-commits, not in
>>>> bugzilla. So, below is fix description.
>>>>
>>>> Fix:
>>>> The are cases when we CAN treat pointers as integers, and places
>>>> when we
>>>> CAN'T. Below is my proposal:
>>>> * We treat pointers as integers when we compare function formal
>>>> arguments.
>>>> * Otherwise, we can't do that in general.
>>>> * We can add more exceptions, where address space affects nothing: for
>>>> example argument of "ret" instruction.
>>>> The patch is attached.
>>>>
>>>> Though, by now, it breaks 3 tests, but only since these tests checks
>>>> things that are wrong in general. We have to decide what to do with
>>>> these things:
>>>> 1. Can we always ignore address space of 'ret' type?
>>>> 2. Isn't it imprortant to tread 'load' instruction as different if they
>>>> accepts pointers with different address spaces?
>>>>
>>>> ,
>>>> _______________________________________________
>>>> llvm-commits mailing list
>>>> llvm-commits at cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>>>
>>>>
>>>> _______________________________________________
>>>> llvm-commits mailing list
>>>> llvm-commits at cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
More information about the llvm-commits
mailing list