On Fri, 5 Feb 2021, Richard Biener wrote:

> On Fri, 5 Feb 2021, Richard Sandiford wrote:
> 
> > Richard Biener <rguent...@suse.de> writes:
> > > On Fri, 5 Feb 2021, Richard Sandiford wrote:
> > >> Richard Biener <rguent...@suse.de> writes:
> > >> > +  /* First produce cost vectors sorted by loop index.  */
> > >> > +  auto_vec<std::pair<unsigned, stmt_info_for_cost *> >
> > >> > +    li_scalar_costs (scalar_costs.length ());
> > >> > +  auto_vec<std::pair<unsigned, stmt_info_for_cost *> >
> > >> > +    li_vector_costs (vector_costs.length ());
> > >> > +  FOR_EACH_VEC_ELT (scalar_costs, i, cost)
> > >> > +    {
> > >> > +      unsigned l = gimple_bb 
> > >> > (cost->stmt_info->stmt)->loop_father->num;
> > >> > +      li_scalar_costs.quick_push (std::make_pair (l, cost));
> > >> > +    }
> > >> > +  unsigned l = li_scalar_costs[0].first;
> > >> 
> > >> Is this just to silence an unused warning?  Might be worth a comment if 
> > >> so
> > >> (although couldn't we just use 0?).
> > >
> > > The issue is that not all vector_costs entries have a stmt_info so 
> > > this uses a random loop also used in the scalar code (that's going
> > > to be the correct loop in case there's only one loop involved which
> > > is probably 99% of the cases).  I'mm add a comment.
> > 
> > Hmm, OK, but I thought the comment below was saying that all such
> > cases follow the relevant statement, instead of coming first.
> > Is this situation specific to the first run of costs?
> 
> It's to some extent out of caution since I did not try to provoke
> the situation but I think there are some paths in costing that
> fail to set a stmt_info for costing of an acutal stmt.  While
> we do want to fix this I don't think it's appropriate to ICE
> for the cases at this point.

So the following passes vect.exp testing on x86_64 but I'm quite
sure it will eventually trigger.

Richard.

diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c
index b9f12c30fb8..0737621cb1b 100644
--- a/gcc/tree-vect-slp.c
+++ b/gcc/tree-vect-slp.c
@@ -4412,13 +4412,14 @@ vect_bb_vectorization_profitable_p (bb_vec_info 
bb_vinfo,
     }
   /* Use a random used loop as fallback in case the first vector_costs
      entry does not have a stmt_info associated with it.  */
-  unsigned l = li_scalar_costs[0].first;
+  unsigned l = -1u;
   FOR_EACH_VEC_ELT (vector_costs, i, cost)
     {
       /* We inherit from the previous COST, invariants, externals and
         extracts immediately follow the cost for the related stmt.  */
       if (cost->stmt_info)
        l = gimple_bb (cost->stmt_info->stmt)->loop_father->num;
+      gcc_assert (l != -1u);
       li_vector_costs.quick_push (std::make_pair (l, cost));
     }
   li_scalar_costs.qsort (li_cost_vec_cmp);

Reply via email to