On Thu, Jun 17, 2021 at 03:48:28PM +0200, Christophe Lyon wrote: > On Tue, 15 Jun 2021 at 08:47, Richard Biener via Gcc-patches > <gcc-patches@gcc.gnu.org> wrote: > > > > On Tue, Jun 15, 2021 at 8:01 AM Trevor Saunders <tbsau...@tbsaunde.org> > > wrote: > > > > > > This ensures callers take ownership of the returned vector. > > > > > > Signed-off-by: Trevor Saunders <tbsau...@tbsaunde.org> > > > > > > bootstrapped and regtested on x86_64-linux-gnu, ok? > > > > OK. > > Since this was committed, I've noticed build errors (for cross-compilers): > /tmp/9562118_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/cfgloopanal.c: > In function 'auto_vec<basic_block_def*> get_loop_hot_path(const > loop*)': > /tmp/9562118_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/cfgloopanal.c:528:10: > error: could not convert 'path' from 'vec<basic_block_def*>' to > 'auto_vec<basic_block_def*>' > return path; > ^ > /tmp/9562118_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/cfgloopanal.c:529:1: > warning: control reaches end of non-void function [-Wreturn-type] > } > ^ > > I'm using gcc-4.8.5 as host compiler
Ah, interesting, I believe the following patch corrects the oversight here. Its interesting that newer compilers use the auto_vec(vec<T> &&) constructor to fix this up but 4.8.5 refuses. diff --git a/gcc/cfgloopanal.c b/gcc/cfgloopanal.c index fdd8d3f43fe..2db46c81036 100644 --- a/gcc/cfgloopanal.c +++ b/gcc/cfgloopanal.c @@ -504,7 +504,7 @@ auto_vec<basic_block> get_loop_hot_path (const class loop *loop) { basic_block bb = loop->header; - vec<basic_block> path = vNULL; + auto_vec<basic_block> path; bitmap visited = BITMAP_ALLOC (NULL); while (true) Sorry about the trouble, will commit the above as obvious if it bootstraps. Trev > > Christophe > > > > > > gcc/ChangeLog: > > > > > > * cfgloop.h (get_loop_hot_path): Return auto_vec<basic_block>. > > > * cfgloopanal.c (get_loop_hot_path): Likewise. > > > * tree-ssa-loop-ivcanon.c (tree_estimate_loop_size): Likewise. > > > --- > > > gcc/cfgloop.h | 2 +- > > > gcc/cfgloopanal.c | 2 +- > > > gcc/tree-ssa-loop-ivcanon.c | 5 ++--- > > > 3 files changed, 4 insertions(+), 5 deletions(-) > > > > > > diff --git a/gcc/cfgloop.h b/gcc/cfgloop.h > > > index 113241da130..5e699276c88 100644 > > > --- a/gcc/cfgloop.h > > > +++ b/gcc/cfgloop.h > > > @@ -840,7 +840,7 @@ enum > > > > > > extern void doloop_optimize_loops (void); > > > extern void move_loop_invariants (void); > > > -extern vec<basic_block> get_loop_hot_path (const class loop *loop); > > > +extern auto_vec<basic_block> get_loop_hot_path (const class loop *loop); > > > > > > /* Returns the outermost loop of the loop nest that contains LOOP.*/ > > > static inline class loop * > > > diff --git a/gcc/cfgloopanal.c b/gcc/cfgloopanal.c > > > index d0eade3dd34..e7b7ae2163e 100644 > > > --- a/gcc/cfgloopanal.c > > > +++ b/gcc/cfgloopanal.c > > > @@ -500,7 +500,7 @@ single_likely_exit (class loop *loop, vec<edge> exits) > > > order against direction of edges from latch. Specially, if > > > header != latch, latch is the 1-st block. */ > > > > > > -vec<basic_block> > > > +auto_vec<basic_block> > > > get_loop_hot_path (const class loop *loop) > > > { > > > basic_block bb = loop->header; > > > diff --git a/gcc/tree-ssa-loop-ivcanon.c b/gcc/tree-ssa-loop-ivcanon.c > > > index 3f9e9d0869f..b1971f83544 100644 > > > --- a/gcc/tree-ssa-loop-ivcanon.c > > > +++ b/gcc/tree-ssa-loop-ivcanon.c > > > @@ -218,7 +218,7 @@ tree_estimate_loop_size (class loop *loop, edge exit, > > > edge edge_to_cancel, > > > gimple_stmt_iterator gsi; > > > unsigned int i; > > > bool after_exit; > > > - vec<basic_block> path = get_loop_hot_path (loop); > > > + auto_vec<basic_block> path = get_loop_hot_path (loop); > > > > > > size->overall = 0; > > > size->eliminated_by_peeling = 0; > > > @@ -342,7 +342,6 @@ tree_estimate_loop_size (class loop *loop, edge exit, > > > edge edge_to_cancel, > > > - size->last_iteration_eliminated_by_peeling) > upper_bound) > > > { > > > free (body); > > > - path.release (); > > > return true; > > > } > > > } > > > @@ -379,7 +378,7 @@ tree_estimate_loop_size (class loop *loop, edge exit, > > > edge edge_to_cancel, > > > size->num_branches_on_hot_path++; > > > } > > > } > > > - path.release (); > > > + > > > if (dump_file && (dump_flags & TDF_DETAILS)) > > > fprintf (dump_file, "size: %i-%i, last_iteration: %i-%i\n", > > > size->overall, > > > size->eliminated_by_peeling, size->last_iteration, > > > -- > > > 2.20.1 > > >