diff options
Diffstat (limited to 'gcc/tree-vectorizer.c')
-rw-r--r-- | gcc/tree-vectorizer.c | 40 |
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 |