Richard Biener via Gcc-patches <gcc-patches@gcc.gnu.org> writes:
> On Tue, Jun 15, 2021 at 8:02 AM Trevor Saunders <tbsau...@tbsaunde.org> wrote:
>>
>> This makes it clear the caller owns the vector, and ensures it is cleaned up.
>>
>> Signed-off-by: Trevor Saunders <tbsau...@tbsaunde.org>
>>
>> bootstrapped and regtested on x86_64-linux-gnu, ok?
>
> OK.
>
> Btw, are "standard API" returns places we can use 'auto'?  That would avoid
> excessive indent for
>
> -  dom_bbs = get_dominated_by_region (CDI_DOMINATORS,
> -                                    bbs.address (),
> -                                    bbs.length ());
> +  auto_vec<basic_block> dom_bbs = get_dominated_by_region (CDI_DOMINATORS,
> +                                                          bbs.address (),
> +                                                          bbs.length ());
>
> and just uses
>
>   auto dom_bbs = get_dominated_by_region (...
>
> Not asking you to do this, just a question for the audience.

Personally I think this would be surprising for something that doesn't
have copy semantics.  (Not that I'm trying to reopen that debate here :-)
FWIW, I agree not having copy semantics is probably the most practical
way forward for now.)

Thanks,
Richard

> Thanks,
> Richard.
>
>> gcc/ChangeLog:
>>
>>         * dominance.c (get_dominated_by_region): Return 
>> auto_vec<basic_block>.
>>         * dominance.h (get_dominated_by_region): Likewise.
>>         * tree-cfg.c (gimple_duplicate_sese_region): Adjust.
>>         (gimple_duplicate_sese_tail): Likewise.
>>         (move_sese_region_to_fn): Likewise.
>> ---
>>  gcc/dominance.c |  4 ++--
>>  gcc/dominance.h |  2 +-
>>  gcc/tree-cfg.c  | 18 +++++++-----------
>>  3 files changed, 10 insertions(+), 14 deletions(-)
>>
>> diff --git a/gcc/dominance.c b/gcc/dominance.c
>> index 0e464cb7282..4943102ff1d 100644
>> --- a/gcc/dominance.c
>> +++ b/gcc/dominance.c
>> @@ -906,13 +906,13 @@ get_dominated_by (enum cdi_direction dir, basic_block 
>> bb)
>>     direction DIR) by some block between N_REGION ones stored in REGION,
>>     except for blocks in the REGION itself.  */
>>
>> -vec<basic_block>
>> +auto_vec<basic_block>
>>  get_dominated_by_region (enum cdi_direction dir, basic_block *region,
>>                          unsigned n_region)
>>  {
>>    unsigned i;
>>    basic_block dom;
>> -  vec<basic_block> doms = vNULL;
>> +  auto_vec<basic_block> doms;
>>
>>    for (i = 0; i < n_region; i++)
>>      region[i]->flags |= BB_DUPLICATED;
>> diff --git a/gcc/dominance.h b/gcc/dominance.h
>> index 515a369aacf..c74ad297c6a 100644
>> --- a/gcc/dominance.h
>> +++ b/gcc/dominance.h
>> @@ -47,7 +47,7 @@ extern basic_block get_immediate_dominator (enum 
>> cdi_direction, basic_block);
>>  extern void set_immediate_dominator (enum cdi_direction, basic_block,
>>                                      basic_block);
>>  extern auto_vec<basic_block> get_dominated_by (enum cdi_direction, 
>> basic_block);
>> -extern vec<basic_block> get_dominated_by_region (enum cdi_direction,
>> +extern auto_vec<basic_block> get_dominated_by_region (enum cdi_direction,
>>                                                          basic_block *,
>>                                                          unsigned);
>>  extern vec<basic_block> get_dominated_to_depth (enum cdi_direction,
>> diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
>> index 6bdd1a561fd..c9403deed19 100644
>> --- a/gcc/tree-cfg.c
>> +++ b/gcc/tree-cfg.c
>> @@ -6495,7 +6495,6 @@ gimple_duplicate_sese_region (edge entry, edge exit,
>>    bool free_region_copy = false, copying_header = false;
>>    class loop *loop = entry->dest->loop_father;
>>    edge exit_copy;
>> -  vec<basic_block> doms = vNULL;
>>    edge redirected;
>>    profile_count total_count = profile_count::uninitialized ();
>>    profile_count entry_count = profile_count::uninitialized ();
>> @@ -6549,9 +6548,9 @@ gimple_duplicate_sese_region (edge entry, edge exit,
>>
>>    /* Record blocks outside the region that are dominated by something
>>       inside.  */
>> +  auto_vec<basic_block> doms;
>>    if (update_dominance)
>>      {
>> -      doms.create (0);
>>        doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
>>      }
>>
>> @@ -6596,7 +6595,6 @@ gimple_duplicate_sese_region (edge entry, edge exit,
>>        set_immediate_dominator (CDI_DOMINATORS, entry->dest, entry->src);
>>        doms.safe_push (get_bb_original (entry->dest));
>>        iterate_fix_dominators (CDI_DOMINATORS, doms, false);
>> -      doms.release ();
>>      }
>>
>>    /* Add the other PHI node arguments.  */
>> @@ -6662,7 +6660,6 @@ gimple_duplicate_sese_tail (edge entry, edge exit,
>>    class loop *loop = exit->dest->loop_father;
>>    class loop *orig_loop = entry->dest->loop_father;
>>    basic_block switch_bb, entry_bb, nentry_bb;
>> -  vec<basic_block> doms;
>>    profile_count total_count = profile_count::uninitialized (),
>>                 exit_count = profile_count::uninitialized ();
>>    edge exits[2], nexits[2], e;
>> @@ -6705,7 +6702,8 @@ gimple_duplicate_sese_tail (edge entry, edge exit,
>>
>>    /* Record blocks outside the region that are dominated by something
>>       inside.  */
>> -  doms = get_dominated_by_region (CDI_DOMINATORS, region, n_region);
>> +  auto_vec<basic_block> doms = get_dominated_by_region (CDI_DOMINATORS, 
>> region,
>> +                                                       n_region);
>>
>>    total_count = exit->src->count;
>>    exit_count = exit->count ();
>> @@ -6785,7 +6783,6 @@ gimple_duplicate_sese_tail (edge entry, edge exit,
>>    /* Anything that is outside of the region, but was dominated by something
>>       inside needs to update dominance info.  */
>>    iterate_fix_dominators (CDI_DOMINATORS, doms, false);
>> -  doms.release ();
>>    /* Update the SSA web.  */
>>    update_ssa (TODO_update_ssa);
>>
>> @@ -7567,7 +7564,7 @@ basic_block
>>  move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
>>                         basic_block exit_bb, tree orig_block)
>>  {
>> -  vec<basic_block> bbs, dom_bbs;
>> +  vec<basic_block> bbs;
>>    basic_block dom_entry = get_immediate_dominator (CDI_DOMINATORS, 
>> entry_bb);
>>    basic_block after, bb, *entry_pred, *exit_succ, abb;
>>    struct function *saved_cfun = cfun;
>> @@ -7599,9 +7596,9 @@ move_sese_region_to_fn (struct function *dest_cfun, 
>> basic_block entry_bb,
>>
>>    /* The blocks that used to be dominated by something in BBS will now be
>>       dominated by the new block.  */
>> -  dom_bbs = get_dominated_by_region (CDI_DOMINATORS,
>> -                                    bbs.address (),
>> -                                    bbs.length ());
>> +  auto_vec<basic_block> dom_bbs = get_dominated_by_region (CDI_DOMINATORS,
>> +                                                          bbs.address (),
>> +                                                          bbs.length ());
>>
>>    /* Detach ENTRY_BB and EXIT_BB from CFUN->CFG.  We need to remember
>>       the predecessor edges to ENTRY_BB and the successor edges to
>> @@ -7937,7 +7934,6 @@ move_sese_region_to_fn (struct function *dest_cfun, 
>> basic_block entry_bb,
>>    set_immediate_dominator (CDI_DOMINATORS, bb, dom_entry);
>>    FOR_EACH_VEC_ELT (dom_bbs, i, abb)
>>      set_immediate_dominator (CDI_DOMINATORS, abb, bb);
>> -  dom_bbs.release ();
>>
>>    if (exit_bb)
>>      {
>> --
>> 2.20.1
>>

Reply via email to