[LLVMdev] Gather load in LLVM IR

Mark Lacey mark.lacey at apple.com
Tue Jan 21 17:06:48 PST 2014


Hi Nick,

On Jan 21, 2014, at 1:54 PM, Nicholas Chapman <admin at indigorenderer.com> wrote:

> Hi Evan, all,
> The most obvious thing to me would be to extend the load instruction to have an additional form that takes a vector of pointers instead of a single pointer.
> This form would return a vector of values instead of a single value.
> If a gather instruction is not available on the target, then the load could be lowered to a series of scalar loads and insert elements.

Are you only interested in gather, or scatter as well?

What are the limitations on the vector of pointers?
- Do they have to have power-of-two number of elements?
- Do they have to point to scalars? If not, does it support any struct/vector type, or only vectors and homogeneous structs with all the elements of the same type?

I ask the latter because if I recall correctly some GPUs have support for doing 16x4 gathers that result in 4 16-wide vectors, where the memory is in array-of-structures form, but the resulting registers are in structure-of-arrays form, i.e. the result is four 16-wide vectors with the elements of the source memory placed such that they were loaded with a stride. In other words if the input pointers pointed to a struct like:
  struct S { float a, b, c, d; }
the result of gathering from a vector of pointers-to-S would be four vectors, one with all the a’s, one with all the b’s, etc.

Mark


> 
> Thanks,
>    Nick
> 
> On 20/01/2014 5:59 p.m., Evan Cheng wrote:
>> On Jan 14, 2014, at 11:11 AM, Nicholas Chapman <admin at indigorenderer.com> wrote:
>> 
>>> Hi All,
>>> I was in the process of implementing a gathering load for my language.  I got the getelementptr vector form working.  However there doesn't seem to be a way to load a vector of values using the vector of pointers from getelementptr.  Am I correct that this is not possible with LLVM IR currently (apart from with the avx2 gather intrinsic)?
>> I believe you are correct. This is not currently possible.
>> 
>>> And if so, are there plans to allow loading of a vector of values?
>>> 
>>> I think extending the load instruction to take a vector of pointers (as would be produced by getelementptr) would work well.
>> This is of interests to a lot of people and I think it's a reasonable time to start the discussion. Do you have any concrete proposal in mind?
>> 
>> Evan
> 
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev





More information about the llvm-dev mailing list