[PATCH 1/1] R600: Use TargetConstant in LowerConstantInitializer
Matt Arsenault
Matthew.Arsenault at amd.com
Wed May 21 12:09:49 PDT 2014
On 05/21/2014 11:25 AM, Jan Vesely wrote:
>
>
>
> On Wed, May 21, 2014 at 12:57 PM, Matt Arsenault <arsenm2 at gmail.com
> <mailto:arsenm2 at gmail.com>> wrote:
>
>
> On May 21, 2014, at 9:43 AM, Matt Arsenault <arsenm2 at gmail.com
> <mailto:arsenm2 at gmail.com>> wrote:
>
>>
>> On May 21, 2014, at 9:30 AM, Matt Arsenault <arsenm2 at gmail.com
>> <mailto:arsenm2 at gmail.com>> wrote:
>>
>>>
>>> On May 21, 2014, at 2:28 AM, Matt Arsenault <arsenm2 at gmail.com
>>> <mailto:arsenm2 at gmail.com>> wrote:
>>>
>>>>
>>>>
>>>> So I think this is sort of correct, but I don't know why this
>>>> function is doing what it's doing. I'm pretty sure you don't
>>>> want to use TargetConstant to fix this. It's copying the
>>>> constant initializer onto the "stack", but expanding it into a
>>>> legal type so the private memory copy doesn't have the exact
>>>> same layout as in the constant. I don't know if that's OK or
>>>> not since I don't know why this is copying it.
>>>>
>>>> Besides that, I think it would be better to get the type to use
>>>> with TLI.getRegisterType() rather than using
>>>> getSmallestLegalIntType. You should also keep the variable as
>>>> MVT since you're trying to only use legal types here.
>>>>
>>>
>>> I think the copying is a workaround for not supporting really
>>> setting up the constant buffer. The constant initializer should
>>> really be copied into some data section of the binary, and the
>>> runtime should load the data into a buffer the kernel will read
>>> from, but that seems to not be implemented.
>
> (based on the original gv-const-addrspace code) the compiler loads
> literals for every element of global array to private memory and then
> chooses from there. It explains why I could not get it to work with
> bigger array than 32 elements.
>
>>
>> Which would also make this incorrect, since what you really want
>> is a truncating store to the correct size at the correct address,
>> but this will store a second i8 in an array 4 bytes later which
>> is wrong. I'm not sure how much effort there is in fixing this
>> workaround vs. really loading the constant data.
>>
>> I noticed a few other problems with this, such as structs and
>> vectors being broken (which I've similarly partially fixed),
>> which also are made more difficult by this coming after vector
>> legalization. These issues would just go away if if the global
>> address was replaced with an implicit kernel argument that the
>> runtime loads the data into.
>
> yeah, this patch is turning out not be the quick fix I thought it
> would, I'd say it's best to drop it for now.
> I think it'd be best to just use vram for global variables (and
> constant address space), we can reuse code that exists for glbal AS*.
> Tom mentioned he might have some patches in this regard.
Yes, I would drop it. I'll commit the test case parts
>
>
> Your test changes are also incorrect. Your check lines now use
> SI-CHECK/EG-CHECK, but the check prefixes are only SI / EG
>
> I missed this part. I can fix it in v3, but I think it would be best
> to just drop this patch, and fix the tests when a proper solution for
> constant AS lands.
>
> regards,
> Jan
>
> * const buff space on EG is too small for OpenCL FULL PROFILE anyway.
> OTOH, limiting this hw to EMBEDDED_PROFILE, so it can use const buffer
> for const as, would enable us to hide the rather slow int64 support
> behind an extension.
>
Constant initializers should be fine to handle in the constant buffers
since if it doesn't fit you can fall back to global, and the common case
is a small initializer. For constant pointer arguments, you have to use
global and there is an AMD extension max_constant_size attribute you can
place on constant pointers to allow assuming they are small enough to fit
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140521/f5663b88/attachment.html>
More information about the llvm-commits
mailing list