[LLVMdev] The use iterator not working...
Zack Waters
zswaters at gmail.com
Tue Jun 9 23:08:05 PDT 2015
Here are some specific examples:
http://www.cs.cmu.edu/afs/cs/academic/class/15745-f09/www/lectures/lect3-llvm.pdf
- Slide 30
http://aviral.lab.asu.edu/?p=1699 - LLVM Def-Use & Use-Def Chains.
http://stackoverflow.com/questions/6807743/def-use-chain-in-llvm
https://github.com/codelion/pa.llvm/blob/master/CVA/CVA.cpp - RunAnalysis
starting line 234
http://lists.cs.uiuc.edu/pipermail/llvmdev/2010-September/034909.html
https://github.com/karrenberg/wfv/blob/master/src/functionPasses/loopLiveValueAnalysis.hpp
- See findUseOutsideLoop function at line 227.
I've seen other projects using LLVM 3.3 that have similar code.
Zack
On Tue, Jun 9, 2015 at 8:19 PM, Jonathan Roelofs <jonathan at codesourcery.com>
wrote:
>
>
> On 6/9/15 8:54 PM, Zack Waters wrote:
>
>> Thanks Dan and Jon. I made an incorrect assumption that the "use"
>> iterator was actually giving me the "user" when de-referencing it.
>>
>> Did it always have this behavior in previous LLVM versions?
>>
>
> Not sure.... I don't know the history of it. Best guess is: "probably".
>
> I've seen
>> lots of examples of the "use" iterator being dereferenced and resulting
>> Instruction pointer being treated as the "user"?
>>
>
> Can you point out specific examples?
>
>
> Jon
>
>
>> Thanks,
>> Zack
>>
>>
>> On Tue, Jun 9, 2015 at 7:25 PM, Jonathan Roelofs
>> <jonathan at codesourcery.com <mailto:jonathan at codesourcery.com>> wrote:
>>
>>
>>
>> On 6/9/15 8:02 PM, Zack Waters wrote:
>>
>> Hi,
>>
>> I'm having a problem with the use iterator. Each "use" that I
>> see, when
>> using the use_iterator, is the same as the "def". Meaning, in
>> the code
>> below the pDef is always equal to pUse pointer for every
>> instruction in
>> all basic blocks (except terminators).
>>
>> for (auto i = inst_begin(f), ie = inst_end(f); i
>> != ie; ++i)
>> Instruction* pDef = &(*i);
>> errs() << "Def: " << *pDef << "\n";
>>
>> for (auto ui = pDef->use_begin(), uie =
>> pDef->use_end(); ui != uie; ++ui)
>> {
>>
>>
>> 'user' != 'use'.
>>
>> Think of llvm::Use as the edge between the place where a value is
>> produced, and the place where that value is consumed. The consumer
>> is the 'User', and the Use points at it.
>>
>> http://llvm.org/docs/doxygen/html/classllvm_1_1Use.html
>> <
>> https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_docs_doxygen_html_classllvm-5F1-5F1Use.html&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=P9nO53gRzaeWOd6JcPss24m-SNOOVI-ki0Gmt8jG2a4&s=vHntZspdmEIervA_wRJRemP18BYspEqdQnW_J99QC28&e=
>> >
>>
>>
>> The confusing thing that's happening below is that the llvm::Use is
>> implicitly converted via `llvm::Use::operator Value *() const` to a
>> `Value*`, and that `Value*` is `pDef`.
>>
>>
>> HTH,
>>
>> Jon
>>
>> Instruction* pUse =
>> dyn_cast<Instruction>(*ui);
>> errs() << " Use: \t" << *pUse << "\n";
>> }
>> }
>>
>> However, everything works as expected when using the range-based
>> use
>> iterator with the following code.
>>
>> for (auto i = inst_begin(f), ie = inst_end(f); i
>> != ie; ++i)
>> {
>> Instruction* pDef = &(*i);
>> errs() << "Def: " << *pDef << "\n";
>>
>> for (User* pUser : pDef->users())
>> {
>> Instruction* pUse =
>> dyn_cast<Instruction>(pUser);
>> errs() << " Use: \t" << *pUse << "\n";
>> }
>> }
>>
>> Also, the code is executed inside a function pass. So was
>> initially
>> thinking I somehow screwed up the use information in a previous
>> pass.
>> However, I would assume the range-based iterator would not work
>> as well
>> but it does.
>>
>> Finally, I'm currently using LLVM 3.5.1 built for Windows.
>> Google hasn't
>> been much help. Anybody have any suggestions as to why the first
>> example
>> above doesn't work?
>>
>> Thanks,
>> Zack
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
>> http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>>
>> --
>> Jon Roelofs
>> jonathan at codesourcery.com <mailto:jonathan at codesourcery.com>
>> CodeSourcery / Mentor Embedded
>>
>>
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>>
> --
> Jon Roelofs
> jonathan at codesourcery.com
> CodeSourcery / Mentor Embedded
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150609/fa5d0bd1/attachment.html>
More information about the llvm-dev
mailing list