Question on Load and GetElementPtr instructions

Hey,

Considering the following instruction:

  %20 = load %struct.Node** getelementptr inbounds (%struct.Node*
          @head, i32 0, i32 0), align 16 ; <%struct.Node*> [#uses=1]

What is the type of the first operand of the instruction (i.e.,
getOperand(0))?

I thought the operand is a "GetElementPtr" instruction, however, the
predicate "isa<Instruction>()" over the operand returns false.
So, I am confused. Can someone clarify the above instruction for me?

By the way, why does not LLVM factor out the operand and instead
generate such two instructions:

  %19 = getelementptr inbounds (%struct.Node* @head, i32 0, i32 0)
  %20 = load %struct.Node** %19, align 16 ; <%struct.Node*> [#uses=1]
  
What it the cause? What are the differences between the
"GetElementPtr inbounds" instruction and just the "GetElementPtr"
instruction?

Thanks,
Xiaolong

Good evening, Tang.

What is the type of the first operand of the instruction (i.e.,
getOperand(0))?

It might be ConstantExpr.
You may use dyn_cast<GEPOperator>(getPointerOperand()).
Also GetElementPtrInst* can be casted to GEPOperator.

...Takumi

Hello Nakamura,

> What is the type of the first operand of the instruction (i.e.,
> getOperand(0))?

It might be ConstantExpr.
You may use dyn_cast<GEPOperator>(getPointerOperand()).
Also GetElementPtrInst* can be casted to GEPOperator.

You are right. Now I use isa<GEPOperator> as the guard.
Thanks.

Best,
Xiaolong

Hi Xiaolong,

Considering the following instruction:

   %20 = load %struct.Node** getelementptr inbounds (%struct.Node*
           @head, i32 0, i32 0), align 16 ;<%struct.Node*> [#uses=1]

What is the type of the first operand of the instruction (i.e.,
getOperand(0))?

I thought the operand is a "GetElementPtr" instruction, however, the
predicate "isa<Instruction>()" over the operand returns false.
So, I am confused. Can someone clarify the above instruction for me?

it is not an Instruction, it is a ConstantExpr. Several expressions like
GEP exist both as instructions and as constants, see the ConstantExpr class.

Ciao,

Duncan.