[llvm-dev] Information about the number of indices in memory accesses

Ees via llvm-dev llvm-dev at lists.llvm.org
Fri Oct 2 16:54:48 PDT 2020


Anyone? I'd really appreciate any hints to look up as i'm somewhat stuck 
with this.

Cheers.

On 23-09-2020 12:27, Ees wrote:
> Hi all,
>
> For loads and stores i want to extract information about the number of 
> indices accessed. For instance:
>
> struct S {int X, int *Y};
>
> __global__ void kernel(int *A, int **B, struct S) {
>   int x = A[..][..]; // -> L: A[..][..]
>   int y = *B[2];   // -> L: B[0][2]
>   int z = S.y[..];  // -> L: S.1[..]
>
>   // etc..
> }
>
> I am performing some preprocessing on IR to:
> 1. Move constant inline GEPs into instructions
> 2. For loads and stores without a GEP operand, explicitly create a 
> (trivial) GEP with index 0
>
> So now the operand of every load and store is a GEP instruction.
>
> For simple stuff i am getting the right answer but when the index 
> expression becomes more complex multiple GEPs are introduced. For 
> instance:
>
> *(A+2*(blockDim.x*blockIdx.x+threadIdx.x+1)+2+3) = 5;
>
> produces:
>
>   %6 = call i32 @llvm.nvvm.read.ptx.sreg.ntid.x()
>   %7 = call i32 @llvm.nvvm.read.ptx.sreg.ctaid.x()
>   %8 = mul i32 %6, %7,
>   %9 = call i32 @llvm.nvvm.read.ptx.sreg.tid.x()
>   %10 = add i32 %8, %9,
>   %11 = add i32 %10, 1,
>   %12 = mul i32 2, %11,
>   %13 = zext i32 %12 to i64,
>   %14 = getelementptr inbounds i32, i32* %0, i64 %13
>   %15 = getelementptr inbounds i32, i32* %14, i64 2
>   %16 = getelementptr inbounds i32, i32* %15, i64 3
>   store i32 5, i32* %16, align 4,
>
> So i guess relying on the number of GEPs to figure the number of 
> indices is only a heuristic. Is there a more robust way to go on about 
> it? Or some example i can look at?
>
> PS: I'm only interested about CUDA kernels.
>
> Ees
>


More information about the llvm-dev mailing list