[PATCH][RFC] C++-style iterators for FOR_EACH_IMM_USE_STMT

Oleg Endo oleg.endo@t-online.de
Tue Oct 29 14:59:00 GMT 2019


On Tue, 2019-10-29 at 11:26 +0100, Richard Biener wrote:
> While I converted other iterators requiring special BREAK_FROM_XYZ
> a few years ago FOR_EACH_IMM_USE_STMT is remaining.  I've pondered
> a bit but cannot arrive at a "nice" solution here with just one
> iterator as the macros happen to use.  For reference, the macro use
> is
> 
>   imm_use_iterator iter;
>   gimple *use_stmt;
>   FOR_EACH_IMM_USE_STMT (use_stmt, iter, name)
>     {
>       use_operand_p use_p;
>       FOR_EACH_IMM_USE_ON_STMT (use_p, iter)
>         ;
>     }
> 
> which expands to (w/o macros)
> 
>    imm_use_iterator iter; 
>    for (gimple *use_stmt = first_imm_use_stmt (&iter, name);
>         !end_imm_use_stmt_p (&iter);
>         use_stmt = nest_imm_use_stmt (&iter))
>      for (use_operand_p use_p = first_imm_use_on_stmt (&iter);
>           !end_imm_use_on_stmt_p (&iter);
>           use_p = next_imm_use_on_stmt (&iter))
>        ;
> 
> and my foolish C++ attempt results in
> 
>      for (imm_use_stmt_iter it = SSAVAR; !it.end_p (); ++it)
>        for (imm_use_stmt_iter::use_on_stmt it2 = it; !it2.end_p ();
> ++it2)
>          ;
> 
> with *it providing the gimple * USE_STMT and *it2 the use_operand_p.
> The complication here is to map the two-level iteration to "the C++
> way".
> Are there any STL examples mimicing this?  Of course with C++11 we
> could
> do
> 
>   for (imm_use_stmt_iter it = SSAVAR; !it.end_p (); ++it)
>     for (auto it2 = it.first_use_on_stmt (); !it2.end_p (); ++it2)
>       ;
> 
> but that's not much nicer either.

Is there a way to put it in such a way that the iterators follow
standard concepts for iterators?  It would increase chances of it
becoming nicer by utilizing range based for loops.

Cheers,
Oleg



More information about the Gcc-patches mailing list