Martin Liška <mli...@suse.cz> writes: > On 6/12/20 3:22 PM, Richard Sandiford wrote: >> Martin Liška <mli...@suse.cz> writes: >>> diff --git a/gcc/tree-vect-patterns.c b/gcc/tree-vect-patterns.c >>> index 636ad59c001..eac372e6abc 100644 >>> --- a/gcc/tree-vect-patterns.c >>> +++ b/gcc/tree-vect-patterns.c >>> @@ -5120,20 +5120,12 @@ vect_determine_precisions (vec_info *vinfo) >>> else >>> { >>> bb_vec_info bb_vinfo = as_a <bb_vec_info> (vinfo); >>> - gimple_stmt_iterator si = bb_vinfo->region_end; >>> - gimple *stmt; >>> - do >>> + for (gimple *stmt: *bb_vinfo) >>> { >>> - if (!gsi_stmt (si)) >>> - si = gsi_last_bb (bb_vinfo->bb); >>> - else >>> - gsi_prev (&si); >>> - stmt = gsi_stmt (si); >>> stmt_vec_info stmt_info = vinfo->lookup_stmt (stmt); >>> if (stmt_info && STMT_VINFO_VECTORIZABLE (stmt_info)) >>> vect_determine_stmt_precisions (vinfo, stmt_info); >>> } >>> - while (stmt != gsi_stmt (bb_vinfo->region_begin)); >>> } >>> } >> >> This loop wants a reverse iterator: it starts at the end and walks >> backwards. That's important because vect_determine_stmt_precisions >> acts based on information recorded about later uses. > > I thought that it may be a problematic change. Note that we don't a have > test coverage for the situation in testsuite (on x86_64). So I'm also > introducing reverse_iterator for this.
There's definitely coverage on aarch64. Thought there would be on x86 too for the PAVG stuff, but obviously not. >>> diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c >>> index cdd6f6c5e5d..766598862d4 100644 >>> --- a/gcc/tree-vect-stmts.c >>> +++ b/gcc/tree-vect-stmts.c >>> @@ -1342,7 +1342,7 @@ vect_init_vector_1 (vec_info *vinfo, stmt_vec_info >>> stmt_vinfo, gimple *new_stmt, >>> else >>> { >>> bb_vec_info bb_vinfo = dyn_cast <bb_vec_info> (vinfo); >>> - gimple_stmt_iterator gsi_region_begin = bb_vinfo->region_begin; >>> + gimple_stmt_iterator gsi_region_begin = bb_vinfo->begin ().gsi; >>> gsi_insert_before (&gsi_region_begin, new_stmt, GSI_SAME_STMT); >>> } >>> } >> >> Feels like this kind-of breaks the abstraction a bit. >> >> Would it make sense instead to add the operators to gimple_stmt_iterator >> itself and just make const_iterator a typedef of that? > > Well, I'm planning to use the _bb_vec_info::const_iterator to jump in between > BBs, so it can't be a simple typedef. But what happens to this code when that happens? Is inserting at begin().gsi meaningful? I.e. is the stmt at *begin() guaranteed to dominate all the SLP code even with multple BBs? Personally I'd prefer either: (a) const_iterator starts out as a typedef of gimple_stmt_iterator, and with your later changes becomes a derived class of it; or (b) we just provide a region_begin() function that returns the gsi directly. > + reverse_iterator rbegin () const > + { > + reverse_iterator it = reverse_iterator (m_region_end); > + if (*it == NULL) > + return reverse_iterator (gsi_last_bb (m_region_end.bb)); > + else > + return it; > + } I think the else case should return “++it” instead, since AIUI m_region_end is an exclusive rather than inclusive endpoint. Also, one minor formatting nit, sorry: the other functions instead indent the “{” block by the same amount as the function prototype, which seems more consistent with the usual out-of-class formatting. Thanks, Richard