[LLVMdev] Question on Load and GetElementPtr instructions

431 views
Skip to first unread message

Xiaolong Tang

unread,
Jun 18, 2010, 7:54:45 AM6/18/10
to LLVM List

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

_______________________________________________
LLVM Developers mailing list
LLV...@cs.uiuc.edu http://llvm.cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

NAKAMURA Takumi

unread,
Jun 18, 2010, 8:16:49 AM6/18/10
to Xiaolong Tang, LLVM List
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

2010/6/18 Xiaolong Tang <xiaolon...@gmail.com>:

Xiaolong Tang

unread,
Jun 18, 2010, 8:40:21 AM6/18/10
to LLVM List, NAKAMURA 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

>
>
> 2010/6/18 Xiaolong Tang <xiaolon...@gmail.com>:
> >
> > 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?

Duncan Sands

unread,
Jun 18, 2010, 8:42:07 AM6/18/10
to llv...@cs.uiuc.edu
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.

Reply all
Reply to author
Forward
0 new messages