What is relationship between Operator and Instruction?

Hello everyone,

I am learning the IR in LLVM and trying to do some analysis. Now I am doing a dataflow analysis via the def-use chain provided by Users.

In my opinion, the Users of a Value should be an instruction. However, when I iterate the User of a Value, sometimes I get an Operator, like GEPOperator, or an ConstantExpr.
I am quite confused about these situations. My question is, what is Operator in IR? and what is the difference between Operator and Instruction? Why can I get a GEPOperator as an Operand in a instruction rather than two instruction( a gep instruction and the next User instruction) ?

Best regards,
Shulin

1 Like

Hi,

Thank you for your suggestions.
I have learnt the basic IR structures in simple programs, but not all the objects could be generated. As I mentioned, about the Operators and ConstantExprs. I only got GEPOperator objects from .bc of MySQL. So is there any reference to learn about the relationship between those classes in IR?

Sincerely,
Shulin

rahul utkoor <rahulutkoor4887@gmail.com> 于2021年6月10日周四 下午5:25写道:

I second this question. I never undersrood this in LLVM IR. LangRef fails to explain this.

Operator is a subclass of User that contains methods that expose common functionality between Instruction and ConstantExpr. For example, having an opcode and operands. This allows a lot of code to treat them the same way without carrying about the differences. A GEPOperator is either a GEP Instruction or a GEP ConstantExpr. GEPOperator lets you not care which it really is. An Instruction can have a ConstantExpr as an operand, but a ConstantExpr cannot have an Instruction as an operand.

The real class hierarchy is such that Instructions and ConstantExpr don’t have the same immediate base class though they both inherit from User. ConstantExpr inherits from Constant which inherits from User. Constant doesn’t have an opcode(other than the one from Value) operands, but ConstantExpr does. Nothing inherits from Operator and it is never instantiated. Because it doesn’t have any data members that aren’t part of User we can static_cast both Instruction and ConstantExpr to it. All of the methods exposed by Operator look at member variables available in User to determine if it is an Instruction or a ConstantExpr and call the appropriate method by static_casting to Instruction or ConstantExpr first.

Hope that helps.

~Craig

Hi Craig,

Thank you very much!

Sincerely,
Shulin

Craig Topper <craig.topper@gmail.com> 于2021年6月11日周五 上午2:50写道:

Hi Rahul,

Thank you very much!

Sincerely,
Shulin

rahul utkoor <rahulutkoor4887@gmail.com> 于2021年6月10日周四 下午9:21写道: