[LLVMdev] The use iterator not working...

Jonathan Roelofs jonathan at codesourcery.com
Tue Jun 9 20:19:04 PDT 2015



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



More information about the llvm-dev mailing list