This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: SSA Iterators




On 1/30/20 11:25 AM, Richard Biener wrote:
On January 30, 2020 5:05:09 PM GMT+01:00, Martin Sebor <msebor@gmail.com> wrote:
On 1/30/20 2:59 AM, Jonathan Wakely wrote:
On Thu, 30 Jan 2020, 05:44 Nicholas Krause wrote:
Greetings,

I was looking into starting to cleaning up the SSA trees for various
reasons and iterators
seem to be the easiest to do. I searched the list to see if someone
mentioned it before
and I ran across this:
https://gcc.gnu.org/ml/gcc-patches/2019-10/msg02031.html

If your trying to get a second ++ working then why not override it
prefix as your
just doing it for postfix and those can be separate.
No no no.

No.

Its not ideal to
have two
different versions for prefix and postfix in terms of overloading
but it
may be
the simplest solution here.
No, making pre-increment and post-incrememt so different things (i.e.
iterate over different ranges) is a horrible idea. That's the kind of
thing that gives operator overloading a bad name. Overloaded
operators
should do the thing you expect them to. They should not be used to
hide a non-obvious action behind an apparently simple syntax.


I would suggest avoiding "smart" iterators that contain all the state
and know their own end point. Instead create a type that holds all
the
state and has begin/end member functions which return an iterator
that
refers to the state. And have the iterator  dereference to some other
object that has the state for the second level of iteration, with its
own begin/end members returning the second iterator type. That would
end up looking like:

    imm_use_stmt_range r (SSAVAR);
    for (imm_use_stmt_iter it = r.begin (); it != r.end (); ++it)
      for (imm_use_on_stmt_iter it2 = it->begin (); it2 != it->end ();
++it2)
        ;

At some point when we move to C++11 or later that could become:

    imm_use_stmt_range r (SSAVAR);
    for (auto& stmt : r)
      for (auto& on_stmt : *stmt)
        ;
That's a good goal to aim for with all GCC "iterators," including
those behind the legacy FOREACH_XXX macros.  I posted a patch for
one of these in 2018 but it was too late in the development cycle
and I didn't get back to in in 2019:
   https://gcc.gnu.org/ml/gcc-patches/2018-11/msg01549.html

If you're working on a general cleanup in this are please consider
these as well.
We should definitely aim for a standard way, adding yet another one doesn't help. Which is why I was trying to tackle the more difficult one(s) first. Most of the iterators should be trivial to convert to whatever style we settle on.

Richard.
Richard,

I do recall there was some agreement on moving to C++11 last year so for each loops should be fine. I'm only aware of the SSA iterators as I was   just researching the SSA code. Not sure of the others as those were the other ones mentioned in the GCC manual
from memory.

In addition the STL mentions const, standard and reverse iterators. I'm assuming we
only need standard but perhaps const versions may be useful  as well.

Regards,

Nick

Martin


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]