[LLVMdev] subtle problem with inst_iterator

Vladimir Prus ghost at cs.msu.su
Fri Apr 23 09:03:01 PDT 2004


Chris Lattner wrote:
> On Fri, 23 Apr 2004, Vladimir Prus wrote:
> > and since result of *it is considered to be rvalue it can't be accepted
> > by this operator. The complete discussion is in
> >
> >     http://std.dkuug.dk/jtc1/sc22/wg21/docs/papers/2002/n1385.htm
> >
> > I'd suggest to apply the following patch which makes operator* return
> > reference to pointer. It makes my code compile and the rest of LLVM
> > compiles too. Comments?
>
> Hrm, I'm not sure about this at all.  In particular ilists have some funny
> semantics that you should know about.  In particular, the instruction list
> is more like a std::list<Instruction> (but that allows polymorphism) than
> a std::list<Instruction*>, 

Yea, I've noticed that. However, it looks like inst_iterator is iterator over 
pointers. Oh, wait a minite, that's the current code:

  inline IIty operator*()  const { return BI; }
  inline IIty operator->() const { return operator*(); }

So operator* works as if value_type is Instruction*, but operator-> works as 
if value_type is Instruction. Hmm ;-)

> so it's not possible to just assign a new
> instruction* through an iterator.  In other words:  *iit = new
> Instruction(...) doesn't make any sense.
>
> Probably the right thing to do would be to make the inst_iterator return a
> reference to the *instruction* itself, rather than a reference to the
> pointer.  This would make it work the same as standard ilist iterators.

Yes, I though about this appoach as well but decided it can be too disturbing 
for other code.

> The reason why we have it return pointers right now is to populate
> worklists, which allows us to do:
>
> std::set<Instruction*> WorkList(inst_begin(F), inst_end(F));

Maybe this can be rewritten like;

    std::set<Instruction*> WorkList;
    std::transform(insn_begin(F), insn_end(F), 
	inserter(WorkList, WorkList.begin(), take_address);

given proper definition of take_addres. Or maybe manual initialization will 
okay. 

So, if you think making inst_iterator's operator* return reference to 
instruction is better than making it return reference to pointer, I can take 
a look at this.

- Volodya




More information about the llvm-dev mailing list