Get Element Ptr inst

Given 2 GEPs as follows,

%tmp124 = getelementptr inbounds %struct.termbox* %termptr.1, i32 0, i32 5, !dbg !1051 ; <[2 x i16]> [#uses=1]
%tmp125 = getelementptr inbounds [2 x i16]
%tmp124, i64 0, i64 0, !dbg !1051 ; <i16*> [#uses=1]

can I replace the 2nd one with

%tmp126 = getelementptr inbounds %struct.termbox* %termptr.1, i32 0, i32 5, i64 0, i64 0 ; <i16*>

When I try to create this instruction i get the follwoing error,

opt: /home/vadve/aggarwa4/llvm27/llvm-2.7/include/llvm/Instructions.h:276: const llvm::Type* llvm::checkType(const llvm::Type*): Assertion `Ty && “Invalid GetElementPtrInst indices for type!”’ failed.

Thanks!
Arushi

Given 2 GEPs as follows,

%tmp124 = getelementptr inbounds %struct.termbox* %termptr.1, i32 0, i32 5, !dbg !1051 ; <[2 x i16]*> [#uses=1]
  %tmp125 = getelementptr inbounds [2 x i16]* %tmp124, i64 0, i64 0, !dbg !1051 ; <i16*> [#uses=1]

can I replace the 2nd one with

%tmp126 = getelementptr inbounds %struct.termbox* %termptr.1, i32 0, i32 5, i64 0, i64 0 ; <i16*>

You should double-check the LangRef manual, but I think the problem stems from the fact that a GEP returns a pointer to the type found after all indexing is completed.

So, in %tmp124, indexing %termptr.1 by i32 0 and i32 5 yields a [2xi16] type, and then the result of the GEP is a pointer to that, which is of type [2xi16] *.

In the new GEP you've created, I think you can remove the first i64 0 index because the result of indexing i32 0 and i32 5 is a [2 x i16] and not a [2 x i16] *.

-- John T.

Thanks John. You are right.

Is this also true for constant GEP expressions? Do they also create a pointer to the calculated type? The language manual does not state so explicitly.

Arushi

Thanks John. You are right.

Is this also true for constant GEP expressions? Do they also create a pointer to the calculated type? The language manual does not state so explicitly.

I would think so.

– John T.