[llvm-dev] What is relationship between Operator and Instruction?

Craig Topper via llvm-dev llvm-dev at lists.llvm.org
Thu Jun 10 11:50:35 PDT 2021


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


On Thu, Jun 10, 2021 at 4:29 AM jeniffer lesley via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

> I second this question. I never undersrood this in LLVM IR. LangRef fails
> to explain this.
>
> On Thu, Jun 10, 2021, 4:46 PM 周书林 via llvm-dev <llvm-dev at lists.llvm.org>
> wrote:
>
>> 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 at gmail.com> 于2021年6月10日周四 下午5:25写道:
>>
>>> Hello,
>>> Since you are starting to learn IR, I recommend you to start with one
>>> simple program, compile the program, genreate CFG and understand the
>>> hierarchy of types/operands/instructions.
>>> It helped me to understand the compilation pipeline in a quick way.
>>>
>>>
>>> Thanks,
>>> Rahul Utkoor
>>>
>>>
>>> On Thu, 10 Jun, 2021, 2:08 pm 周书林 via llvm-dev, <llvm-dev at lists.llvm.org>
>>> wrote:
>>>
>>>> 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
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> llvm-dev at lists.llvm.org
>>>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>>
>>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210610/e69ec58a/attachment.html>


More information about the llvm-dev mailing list