[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