<div dir="ltr">Hi Alberto,<br><br>It seems to me that what you are trying to achieve falls into a bucket of Points-To Analysis. Given a pointer (or a pointer + memory instruction), PTA identifies its allocation sites -- all places that could have created the pointed-to object [1, 2].<br><br>In this simplest case, you can take a value, strip casts, and get to load. Once you have the load, you can strip pointer casts of the pointer operand until you either reach an allocation site or an instruction you won't know how to look through. I implemented something similar here [3], while BasicAA should (internally) have something more robust [4]. If you are interested in cross-function cases (interprocedural), you may be interested in external PTAs for LLVM like SVF [5] or SeaDsa [6]. Note that in the interprocedural case, you have to be careful what you consider an allocation site, especially with external functions that return pointers.<br><br>Sincerely,<br>Jakub<br><br>----------<br><br>[1] Michael Hind, "Pointer Analysis: Haven’t We Solved This Problem Yet?", <a href="https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.91.9469&rep=rep1&type=pdf">https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.91.9469&rep=rep1&type=pdf</a><br>[2] Yannis Smaragdakis, George Balatsouras, "Pointer Analysis", <a href="https://yanniss.github.io/points-to-tutorial15.pdf">https://yanniss.github.io/points-to-tutorial15.pdf</a><div>[3] <a href="https://github.com/seahorn/seahorn/blob/7c160d113c57b650bca28920e8670b56a9e1262f/lib/Transforms/Instrumentation/SimpleMemoryCheck.cc#L328">https://github.com/seahorn/seahorn/blob/7c160d113c57b650bca28920e8670b56a9e1262f/lib/Transforms/Instrumentation/SimpleMemoryCheck.cc#L328</a><br>[4] <a href="https://github.com/llvm/llvm-project/blob/89fb9e8ce151d48b56a6bc25de62e93743e0d6c1/llvm/lib/Analysis/BasicAliasAnalysis.cpp#L633">https://github.com/llvm/llvm-project/blob/89fb9e8ce151d48b56a6bc25de62e93743e0d6c1/llvm/lib/Analysis/BasicAliasAnalysis.cpp#L633</a><br>[5] <a href="https://github.com/SVF-tools/SVF">https://github.com/SVF-tools/SVF</a><br>[6] <a href="https://github.com/seahorn/sea-dsa">https://github.com/seahorn/sea-dsa</a></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jul 29, 2019 at 1:45 AM Joan Lluch via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">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 style="overflow-wrap: break-word;"><div dir="auto" style="overflow-wrap: break-word;">Hi Alberto,</div><div dir="auto" style="overflow-wrap: break-word;"><br></div><div dir="auto" style="overflow-wrap: break-word;">I have not used this myself, but I think you should be able to visit your Instruction ‘users()’. I think the name this function was given is a bit confusing, but this returns an iterator range you can iterate through to find instructions that depend on a given one. </div><div dir="auto" style="overflow-wrap: break-word;"><br></div><div dir="auto" style="overflow-wrap: break-word;">Similarly, you have the function ‘uses()’ that can be used to traverse down the DAG when instructions are still on SSA form. </div><div dir="auto" style="overflow-wrap: break-word;"><br></div><div dir="auto" style="overflow-wrap: break-word;">Look also at the related functions 'user_end()’, 'user_begin()’, 'use_end()' and 'use_begin() </div><div dir="auto" style="overflow-wrap: break-word;"><br></div><div dir="auto" style="overflow-wrap: break-word;">I hope this helps.</div><div dir="auto" style="overflow-wrap: break-word;"><br></div><div dir="auto" style="overflow-wrap: break-word;">Joan<br><div><br></div><div><br></div><div><br></div><div><br><div><blockquote type="cite"><div>On 28 Jul 2019, at 08:29, Alberto Barbaro via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:</div><br class="gmail-m_-4087143504723352887Apple-interchange-newline"><div><div dir="ltr"><div>Hi,</div><div>I was thinking that maybe there is always some sort of dependency analysis that would allow me to visit a tree from the AllocaInst to the IcmpInst. Is it already possible?</div><div><br></div><div>Thanks<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Il giorno dom 28 lug 2019 alle ore 07:21 Alberto Barbaro <<a href="mailto:barbaro.alberto@gmail.com" target="_blank">barbaro.alberto@gmail.com</a>> ha scritto:<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 Tim,</div><div>as always thanks for your help. Unfortunately I made a mistake in my email but apart from that I still have problems.<br></div><div><br></div><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Il giorno sab 27 lug 2019 alle ore 11:53 Tim Northover <<a href="mailto:t.p.northover@gmail.com" target="_blank">t.p.northover@gmail.com</a>> ha scritto:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Alberto,<br>
<br>
On Sat, 27 Jul 2019 at 10:09, Alberto Barbaro via llvm-dev<br>
<<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br>
> Having the reference I to the instruction in bold.Can i efficiently know that the variable %11 was "created" by the %3 = alloca [40 x i8], align 16.<br>
<br>
Yes, I.getOperand(0) *is* the AllocaInst in this case. So for example<br>
isa<AllocaInst>(I.getOperand(0)) will return true. And if you care<br>
about more details you can dyn_cast<AllocaInst> it and check any other<br>
properties you want.<br>
<br></blockquote><div><br></div><div>I would like to use the approach you described considering I to be a reference to the icmp instruction ( %13 = icmp eq i32 %12, 66 ). From what I understood i should do something like:</div><div><br></div><div>Instruction* source;<br> <br>      if(source = dyn_cast<AllocaInst>(I.getOperand(0))) {<br>    cout << "Alloca Inst" << endl;<br>            I.dump();<br>                  getchar();<br>    }</div><div><br></div><div>I thought I.getOperand(0) was a reference to the instruction that have created %12. What am I missing?<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
Cheers.<br>
<br>
Tim.<br></blockquote><div><br></div><div>Thanks again</div><div>Alberto<br></div></div></div>
</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" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br></div></blockquote></div><br></div></div></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><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div>Jakub Kuderski</div></div>