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

Ees via llvm-dev llvm-dev at lists.llvm.org
Wed Sep 23 03:27:09 PDT 2020


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