diff options
author | Martin Liska <mliska@suse.cz> | 2020-06-11 13:25:40 +0200 |
---|---|---|
committer | Martin Liska <mliska@suse.cz> | 2020-06-18 16:58:27 +0200 |
commit | 72cb486456a39524c6f822327ba8654b0221ff4c (patch) | |
tree | 23e189d3c2bbf03b63ddf6c07c31c29dd2684b03 /gcc/tree-vectorizer.h | |
parent | bd0a89dcd8d13ad78950eb24eb3d1680f81ba95a (diff) | |
download | gcc-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.h | 82 |
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; |