Help on finding Base GEP


Below is the snippet of LLVM IR code generated by Flang

%3 = getelementptr i64, i64* %“a$sd”, i64 11, !dbg !16

%4 = bitcast i64* %3 to i32*, !dbg !16
%5 = load i32, i32* %4, align 4, !dbg !16, !tbaa !22


My requirement is for any such LoadInst (example: %5), I want to check if its base GEP (i.e. %3) loads at particular offset (11) from its corresponding arrays descriptor structure (a$sd).

is there any API in LLVM to check this? or I need to write my own?


You can run SCEV which will see through bitcasts and GEPs, so it should give an expression of the form (base + offset) on the pointer of the load.


Specifically, you can use ScalarEvolution to subtract the expression for the base descriptor from the expression for the loaded pointer and see if the result is a SCEVConstant. Also, you might find GetPointerBaseWithConstantOffset (in ValueTracking.h) useful. -Hal