<div dir="ltr"><div dir="ltr">Sure!<div><br></div><div>The following snippet is the main function I implemented to visit the Users of GlobalVariables.<br><div><pre style="white-space:pre-wrap;overflow:auto hidden;font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono",monospace;font-size:0.95em;line-height:16.625px;padding:0.5em;border:1px solid rgb(204,204,204);background-color:rgb(248,248,248)"><div style="background-color:rgb(253,246,227);font-family:"Cascadia Code, \007b49\007ebf",Consolas,"Courier New",monospace;font-size:14px;line-height:19px;white-space:pre"><div style="color:rgb(51,51,51)"><span style="color:rgb(133,153,0)">for</span>(<span style="color:rgb(38,139,210)">Value</span>::user_iterator i<span style="color:rgb(133,153,0)">=</span><span style="color:rgb(38,139,210)">gv</span>-><span style="color:rgb(38,139,210)">user_begin</span>(), e<span style="color:rgb(133,153,0)">=</span><span style="color:rgb(38,139,210)">gv</span>-><span style="color:rgb(38,139,210)">user_end</span>(); i<span style="color:rgb(133,153,0)">!=</span>e; i<span style="color:rgb(133,153,0)">++</span>)</div><div style="color:rgb(51,51,51)">{</div><div style="color:rgb(51,51,51)">    User<span style="color:rgb(133,153,0)">*</span> cur_user <span style="color:rgb(133,153,0)">=</span> <span style="color:rgb(133,153,0)">*</span>i;</div><div style=""><font color="#333333">    </font><span style="color:rgb(38,139,210)">cur_user</span><font color="#333333">-></font><span style="color:rgb(38,139,210)">print</span><font color="#333333">(</font><span style="color:rgb(38,139,210)">llvm</span><font color="#333333">::</font><span style="color:rgb(38,139,210)">outs</span><font color="#333333">());</font></div><div style=""><font color="#333333">    </font><span style="color:rgb(38,139,210)">llvm</span><span style="color:rgb(38,139,210)">::</span><span style="color:rgb(38,139,210)">outs</span><font color="#333333">()</font><span style="color:rgb(133,153,0)"><<</span><span style="color:rgb(42,161,152)">"</span><span style="color:rgb(203,75,22)">\n</span><span style="color:rgb(42,161,152)">"</span><font color="#333333">;</font></div><font color="#333333"><br></font><div style=""><font color="#333333">    </font><span style="color:rgb(133,153,0)">if</span><font color="#333333">(Instruction</font><span style="color:rgb(133,153,0)">*</span><font color="#333333"> inst </font><span style="color:rgb(133,153,0)">=</span><font color="#333333"> </font><span style="color:rgb(38,139,210)">dyn_cast</span><font color="#333333"><</font><span style="color:rgb(38,139,210)">Instruction</span><font color="#333333">>(cur_user))</font></div><div style="color:rgb(51,51,51)">    {</div><div style="color:rgb(51,51,51)"><span style="color:rgb(147,161,161);font-style:italic">        // record source location info</span></div><div style="color:rgb(51,51,51)">    }</div><div style=""><font color="#333333">    </font><span style="color:rgb(133,153,0)">else</span><font color="#333333"> </font><span style="color:rgb(133,153,0)">if</span><font color="#333333">(GEPOperator</font><span style="color:rgb(133,153,0)">*</span><font color="#333333"> gepo </font><span style="color:rgb(133,153,0)">=</span><font color="#333333"> </font><span style="color:rgb(38,139,210)">dyn_cast</span><font color="#333333"><</font><span style="color:rgb(38,139,210)">GEPOperator</span><font color="#333333">>(cur_user))</font></div><div style="color:rgb(51,51,51)">    {</div><div style=""><font color="#333333">        </font><span style="color:rgb(38,139,210)">llvm</span><font color="#333333">::</font><span style="color:rgb(38,139,210)">outs</span><font color="#333333">()</font><span style="color:rgb(133,153,0)"><<</span><span style="color:rgb(42,161,152)">"It is a GEPOperator.</span><span style="color:rgb(203,75,22)">\n</span><span style="color:rgb(42,161,152)">"</span><font color="#333333">;</font></div><font color="#333333"><br></font><div style=""><font color="#333333">        </font><span style="color:rgb(133,153,0)">for</span><font color="#333333">(aute it</font><span style="color:rgb(133,153,0)">=</span><span style="color:rgb(38,139,210)">gepo</span><font color="#333333">-></font><span style="color:rgb(38,139,210)">user_begin</span><font color="#333333">(); it</font><span style="color:rgb(133,153,0)">!=</span><span style="color:rgb(38,139,210)">gepo</span><font color="#333333">-></font><span style="color:rgb(38,139,210)">uesr_end</span><font color="#333333">(); </font><span style="color:rgb(133,153,0)">++</span><font color="#333333">it)</font></div><div style="color:rgb(51,51,51)">        {</div><div style="color:rgb(51,51,51)">            User<span style="color:rgb(133,153,0)">*</span> user <span style="color:rgb(133,153,0)">=</span> <span style="color:rgb(133,153,0)">*</span>it;</div><div style=""><font color="#333333">            </font><span style="color:rgb(38,139,210)">llvm</span><font color="#333333">::</font><span style="color:rgb(38,139,210)">outs</span><font color="#333333">()</font><span style="color:rgb(133,153,0)"><<</span><span style="color:rgb(42,161,152)">"One of the User:"</span><font color="#333333">;</font></div><div style=""><font color="#333333">            </font><span style="color:rgb(38,139,210)">user</span><font color="#333333">-></font><span style="color:rgb(38,139,210)">print</span><font color="#333333">(</font><span style="color:rgb(38,139,210)">llvm</span><font color="#333333">::</font><span style="color:rgb(38,139,210)">outs</span><font color="#333333">());</font></div><div style=""><font color="#333333">            </font><span style="color:rgb(38,139,210)">llvm</span><font color="#333333">::</font><span style="color:rgb(38,139,210)">outs</span><font color="#333333">()</font><span style="color:rgb(133,153,0)"><<</span><span style="color:rgb(42,161,152)">"</span><span style="color:rgb(203,75,22)">\n</span><span style="color:rgb(42,161,152)">"</span><font color="#333333">;</font></div><div style="color:rgb(51,51,51)">        }</div><div style="color:rgb(51,51,51)">    }</div><div style="color:rgb(51,51,51)">}</div></div></pre></div></div></div><br><div class="gmail_quote"><div class="gmail_attr">And the source file of test case is, the "ttt.field_b" in the main() is presented as a GEPOperator in the generated IR file.</div><div class="gmail_attr"><pre style="white-space:pre-wrap;overflow:auto hidden;font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono",monospace;font-size:0.95em;line-height:16.625px;padding:0.5em;border:1px solid rgb(204,204,204);background-color:rgb(248,248,248);color:rgb(0,0,0)"><div style="color:rgb(51,51,51);background-color:rgb(253,246,227);font-family:"Cascadia Code, \007b49\007ebf",Consolas,"Courier New",monospace;font-size:14px;line-height:19px;white-space:pre"><div><span style="color:rgb(7,54,66);font-weight:bold">struct</span> <span style="color:rgb(38,139,210)">TTT</span>{</div><div>    <span style="color:rgb(7,54,66);font-weight:bold">int</span> <span style="color:rgb(38,139,210)">field_a</span>;</div><div>    <span style="color:rgb(7,54,66);font-weight:bold">int</span> <span style="color:rgb(38,139,210)">field_b</span>;</div><div>    <span style="color:rgb(7,54,66);font-weight:bold">int</span> <span style="color:rgb(38,139,210)">field_c;</span></div><div>};</div><div>
<div style="line-height:19px"><div><span style="color:rgb(7,54,66);font-weight:bold">struct</span> <span style="color:rgb(38,139,210)">TTT</span> <span style="color:rgb(38,139,210)">ttt</span>;</div><div><br></div></div>int main()</div><div>{</div><div>    ...</div><div>    int b = a - ttt.field_b;</div><div>    ...</div><div>}

</div></div></pre></div><div dir="ltr" class="gmail_attr"><br></div><div dir="ltr" class="gmail_attr"><br></div><div dir="ltr" class="gmail_attr">Craig Topper <<a href="mailto:craig.topper@gmail.com">craig.topper@gmail.com</a>> 于2021年6月18日周五 下午12:55写道:<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">Can you share your code?</div><div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Jun 17, 2021 at 9:44 PM 周书林 <<a href="mailto:zhoushulin1992@gmail.com" target="_blank">zhoushulin1992@gmail.com</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 Craig,<div><br></div><div>I have tried to visit the Users of current GEPOperator, but the results are not what I am looking for.</div><div>In detail, when I tried to get the Users of GEPOperator of the LoadInst, i.e. <b>

<i>getelementptr inbounds (%struct.TTT, %struct.TTT* @ttt, i32 0, i32 2) </i></b>,</div><div>the results are turned out to be Users of GlobalVariable <i style="font-weight:bold">@ttt, </i>i.e. something like </div><div><b><i>i8* bitcast (%struct.TTT* @ttt to i8*)</i></b>, or <b><i>i32* getelementptr inbounds (%struct.TTT, %struct.TTT* @ttt, i32 0, i32 1)</i></b>.<br></div><div><br>I am not sure what happened here. Is that the def-use chain of structural global variables always contains the whole information related to the global variable?</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" target="_blank">craig.topper@gmail.com</a>> 于2021年6月18日周五 上午10:14写道:<br></div></div><div class="gmail_quote"><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">I see so you want to see where the GlobalVariable is accesssed. You should be able to get the Users of the ConstantExpr as well, those will either be another ConstantExpr or an Instruction. In your example, one of the Users of the GEPOperator should be the LoadInst.<div><div><br clear="all"><div><div dir="ltr">~Craig</div></div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Jun 17, 2021 at 7:06 PM 周书林 <<a href="mailto:zhoushulin1992@gmail.com" target="_blank">zhoushulin1992@gmail.com</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"><div>Hi Craig,</div><div><br></div>I started from GlobalVaribles, so there are situations that I met the ConstantExprs, i.e. some Operators.</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Craig Topper <<a href="mailto:craig.topper@gmail.com" target="_blank">craig.topper@gmail.com</a>> 于2021年6月18日周五 上午8:37写道:<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">How did you choose where you started from? An Instruction can only be used by another Instruction, but it seems you've started from a Constant which can be used by ConstantExprs.<div><br clear="all"><div><div dir="ltr">~Craig</div></div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Jun 17, 2021 at 5:25 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 Michael, <div><br></div><div>Thank you very much! </div><div>I have a further question: if I want to get the dataflow of a target Value, is there any way to handle these situations when iterate the Users?Or only by iterator all the instructions and their operands? </div><div><br></div><div>Sincerely,</div><div>Shulin</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Michael Kruse <<a href="mailto:llvmdev@meinersbur.de" target="_blank">llvmdev@meinersbur.de</a>> 于2021年6月18日周五 上午5:11写道:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Am Do., 17. Juni 2021 um 10:24 Uhr schrieb 周书林 via llvm-dev<br>
<<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>>:<br>
> %39 = load i32, i32* getelementptr inbounds (%struct.TTT, %struct.TTT* @ttt, i32 0, i32 2), align 8, !dbg !971<br>
<br>
%39 is the LoadInst, while getelementptr is its second operand. It is<br>
inlined because it is an llvm::Constant, not an instruction. Constants<br>
do not participate in use/user-chains and hence there is no link from<br>
GEP to the LoadInst that is using it. The constant GEP object may be<br>
used by an arbitrary number of other instructions, other constants in<br>
the same or other functions.<br>
<br>
Node that there "GEPOperator" can represent either a GetElementPtrInst<br>
(i.e. an instruction) or a GEP constant expression (derived from<br>
ConstantExpr)<br>
<br>
Michael<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>
</blockquote></div>
</blockquote></div>
</blockquote></div></div>-- <br><div dir="ltr">~Craig</div>
</blockquote></div></div>