aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vectorizer.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2020-07-03 10:09:39 +0200
committerRichard Biener <rguenther@suse.de>2020-07-03 11:29:16 +0200
commit9e5508c2d006f2d4f8670e6c3fed770ac1c85e64 (patch)
tree3fe50f35e5da1a34dd92b35c2ac38ef5461bc743 /gcc/tree-vectorizer.c
parent26b538cd81b9692eaf519fa1743ca8c282048793 (diff)
downloadgcc-9e5508c2d006f2d4f8670e6c3fed770ac1c85e64.zip
gcc-9e5508c2d006f2d4f8670e6c3fed770ac1c85e64.tar.gz
gcc-9e5508c2d006f2d4f8670e6c3fed770ac1c85e64.tar.bz2
refactor SLP constant insertion and provde entry insert helper
This provides helpers to insert stmts on region entry abstracted from loop/basic-block split out from vec_init_vector and used from the SLP constant code generation path. The SLP constant code generation path is also changed to avoid needless SSA copying since we can store VECTOR_CSTs directly in the vectorized defs array, improving the IL from the vectorizer. 2020-07-03 Richard Biener <rguenther@suse.de> * tree-vectorizer.h (vec_info::insert_on_entry): New. (vec_info::insert_seq_on_entry): Likewise. * tree-vectorizer.c (vec_info::insert_on_entry): Implement. (vec_info::insert_seq_on_entry): Likewise. * tree-vect-stmts.c (vect_init_vector_1): Use vec_info::insert_on_entry. (vect_finish_stmt_generation): Set modified bit after adjusting VUSE. * tree-vect-slp.c (vect_create_constant_vectors): Simplify by using vec_info::insert_seq_on_entry and bypassing vec_init_vector. (vect_schedule_slp_instance): Deal with all-constant children later.
Diffstat (limited to 'gcc/tree-vectorizer.c')
-rw-r--r--gcc/tree-vectorizer.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c
index 78d9da6..26a1846 100644
--- a/gcc/tree-vectorizer.c
+++ b/gcc/tree-vectorizer.c
@@ -625,6 +625,46 @@ vec_info::replace_stmt (gimple_stmt_iterator *gsi, stmt_vec_info stmt_info,
gsi_replace (gsi, new_stmt, true);
}
+/* Insert stmts in SEQ on the VEC_INFO region entry. If CONTEXT is
+ not NULL it specifies whether to use the sub-region entry
+ determined by it, currently used for loop vectorization to insert
+ on the inner loop entry vs. the outer loop entry. */
+
+void
+vec_info::insert_seq_on_entry (stmt_vec_info context, gimple_seq seq)
+{
+ if (loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (this))
+ {
+ class loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
+ basic_block new_bb;
+ edge pe;
+
+ if (context && nested_in_vect_loop_p (loop, context))
+ loop = loop->inner;
+
+ pe = loop_preheader_edge (loop);
+ new_bb = gsi_insert_seq_on_edge_immediate (pe, seq);
+ gcc_assert (!new_bb);
+ }
+ else
+ {
+ bb_vec_info bb_vinfo = as_a <bb_vec_info> (this);
+ gimple_stmt_iterator gsi_region_begin = bb_vinfo->region_begin;
+ gsi_insert_seq_before (&gsi_region_begin, seq, GSI_SAME_STMT);
+ }
+}
+
+/* Like insert_seq_on_entry but just inserts the single stmt NEW_STMT. */
+
+void
+vec_info::insert_on_entry (stmt_vec_info context, gimple *new_stmt)
+{
+ gimple_seq seq = NULL;
+ gimple_stmt_iterator gsi = gsi_start (seq);
+ gsi_insert_before_without_update (&gsi, new_stmt, GSI_SAME_STMT);
+ insert_seq_on_entry (context, seq);
+}
+
/* Create and initialize a new stmt_vec_info struct for STMT. */
stmt_vec_info