<div dir="ltr">Hi Craig,<div> </div><div>Thank you very much!</div><div><br></div><div>Sincerely,</div><div>Shulin</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Craig Topper <<a href="mailto:craig.topper@gmail.com">craig.topper@gmail.com</a>> 于2021年6月11日周五 上午2:50写道:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>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.<br></div><div><br></div><div>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.<div><br></div><div><div>Hope that helps.<br><div><br><div><div><div dir="ltr">~Craig</div></div><br></div></div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Jun 10, 2021 at 4:29 AM jeniffer lesley via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto">I second this question. I never undersrood this in LLVM IR. LangRef fails to explain this.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Jun 10, 2021, 4:46 PM 周书林 via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hi, <div><br></div><div>Thank you for your suggestions. </div><div>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? </div><div><br></div><div>Sincerely,</div><div>Shulin</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">rahul utkoor <<a href="mailto:rahulutkoor4887@gmail.com" rel="noreferrer" target="_blank">rahulutkoor4887@gmail.com</a>> 于2021年6月10日周四 下午5:25写道:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto"><div>Hello,<div dir="auto">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.</div><div dir="auto">It helped me to understand the compilation pipeline in a quick way.</div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto">Thanks,</div><div dir="auto">Rahul Utkoor</div><br><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, 10 Jun, 2021, 2:08 pm 周书林 via llvm-dev, <<a href="mailto:llvm-dev@lists.llvm.org" rel="noreferrer" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hello everyone,<div><br></div><div>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.</div><div><br></div><div>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.</div><div>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) ?</div><div><br></div><div>Best regards,</div><div>Shulin</div></div>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" rel="noreferrer noreferrer" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer noreferrer noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div></div></div>
</blockquote></div>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" rel="noreferrer" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div>
</blockquote></div>