[LLVMdev] The use iterator not working...

Jonathan Roelofs jonathan at codesourcery.com
Tue Jun 9 19:25:08 PDT 2015



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

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         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