aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vectorizer.h
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2020-06-11 13:25:40 +0200
committerMartin Liska <mliska@suse.cz>2020-06-18 16:58:27 +0200
commit72cb486456a39524c6f822327ba8654b0221ff4c (patch)
tree23e189d3c2bbf03b63ddf6c07c31c29dd2684b03 /gcc/tree-vectorizer.h
parentbd0a89dcd8d13ad78950eb24eb3d1680f81ba95a (diff)
downloadgcc-72cb486456a39524c6f822327ba8654b0221ff4c.zip
gcc-72cb486456a39524c6f822327ba8654b0221ff4c.tar.gz
gcc-72cb486456a39524c6f822327ba8654b0221ff4c.tar.bz2
vectorizer: add _bb_vec_info::region_stmts and reverse_region_stmts
gcc/ChangeLog: * coretypes.h (struct iterator_range): New type. * tree-vect-patterns.c (vect_determine_precisions): Use range-based iterator. (vect_pattern_recog): Likewise. * tree-vect-slp.c (_bb_vec_info): Likewise. (_bb_vec_info::~_bb_vec_info): Likewise. (vect_slp_check_for_constructors): Likewise. * tree-vectorizer.h:Add new iterators and functions that use it.
Diffstat (limited to 'gcc/tree-vectorizer.h')
-rw-r--r--gcc/tree-vectorizer.h82
1 files changed, 82 insertions, 0 deletions
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index a200991..32feec3 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -792,9 +792,91 @@ loop_vec_info_for_loop (class loop *loop)
typedef class _bb_vec_info : public vec_info
{
public:
+
+ /* GIMPLE statement iterator going from region_begin to region_end. */
+
+ struct const_iterator
+ {
+ const_iterator (gimple_stmt_iterator _gsi) : gsi (_gsi) {}
+
+ const const_iterator &
+ operator++ ()
+ {
+ gsi_next (&gsi); return *this;
+ }
+
+ gimple *operator* () const { return gsi_stmt (gsi); }
+
+ bool
+ operator== (const const_iterator &other) const
+ {
+ return gsi_stmt (gsi) == gsi_stmt (other.gsi);
+ }
+
+ bool
+ operator!= (const const_iterator &other) const
+ {
+ return !(*this == other);
+ }
+
+ gimple_stmt_iterator gsi;
+ };
+
+ /* GIMPLE statement iterator going from region_end to region_begin. */
+
+ struct const_reverse_iterator
+ {
+ const_reverse_iterator (gimple_stmt_iterator _gsi) : gsi (_gsi) {}
+
+ const const_reverse_iterator &
+ operator++ ()
+ {
+ gsi_prev (&gsi); return *this;
+ }
+
+ gimple *operator* () const { return gsi_stmt (gsi); }
+
+ bool
+ operator== (const const_reverse_iterator &other) const
+ {
+ return gsi_stmt (gsi) == gsi_stmt (other.gsi);
+ }
+
+ bool
+ operator!= (const const_reverse_iterator &other) const
+ {
+ return !(*this == other);
+ }
+
+ gimple_stmt_iterator gsi;
+ };
+
_bb_vec_info (gimple_stmt_iterator, gimple_stmt_iterator, vec_info_shared *);
~_bb_vec_info ();
+ /* Returns iterator_range for range-based loop. */
+
+ iterator_range<const_iterator>
+ region_stmts ()
+ {
+ return iterator_range<const_iterator> (region_begin, region_end);
+ }
+
+ /* Returns iterator_range for range-based loop in a reverse order. */
+
+ iterator_range<const_reverse_iterator>
+ reverse_region_stmts ()
+ {
+ const_reverse_iterator begin = region_end;
+ if (*begin == NULL)
+ begin = const_reverse_iterator (gsi_last_bb (region_end.bb));
+ else
+ ++begin;
+
+ const_reverse_iterator end = region_begin;
+ return iterator_range<const_reverse_iterator> (begin, ++end);
+ }
+
basic_block bb;
gimple_stmt_iterator region_begin;
gimple_stmt_iterator region_end;