Help on finding Base GEP

Hi,

Below is the snippet of LLVM IR code generated by Flang

—snip–
%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

—snip–

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?

regards,
Venkat.

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.

Cheers
siddharth

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

Hi,