aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vectorizer.c
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-11-06 11:15:40 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-11-06 11:15:40 +0000
commit61d371eb413e6917f59bea804b3c167e31f88f98 (patch)
tree74dcc1ae8899af0f2b008c2052a07e430f301776 /gcc/tree-vectorizer.c
parent66a5f0b45ff2dc172035f896903d846a6f86e8d0 (diff)
downloadgcc-61d371eb413e6917f59bea804b3c167e31f88f98.zip
gcc-61d371eb413e6917f59bea804b3c167e31f88f98.tar.gz
gcc-61d371eb413e6917f59bea804b3c167e31f88f98.tar.bz2
tree-vectorizer.h (struct _bb_vec_info): Add region_begin/end members.
2015-11-06 Richard Biener <rguenther@suse.de> * tree-vectorizer.h (struct _bb_vec_info): Add region_begin/end members. (vect_stmt_in_region_p): Declare. * tree-vect-slp.c (new_bb_vec_info): Work on a region. (destroy_bb_vec_info): Likewise. (vect_bb_slp_scalar_cost): Use vect_stmt_in_region_p. (vect_get_and_check_slp_defs): Likewise. (vect_slp_analyze_bb_1): Refactor to make it work on sub-BBs. (vect_slp_bb): Likewise. * tree-vect-patterns.c (vect_same_loop_or_bb_p): Implement in terms of vect_stmt_in_region_p. (vect_pattern_recog): Iterate over the BB region. * tree-vect-stmts.c (vect_is_simple_use): Use vect_stmt_in_region_p. * tree-vectorizer.c (vect_stmt_in_region_p): New function. (pass_slp_vectorize::execute): Initialize all stmt UIDs to -1. * config/i386/i386.c: Include gimple-iterator.h. * config/aarch64/aarch64.c: Likewise. * gcc.dg/vect/bb-slp-38.c: New testcase. From-SVN: r229842
Diffstat (limited to 'gcc/tree-vectorizer.c')
-rw-r--r--gcc/tree-vectorizer.c35
1 files changed, 35 insertions, 0 deletions
diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c
index 7b3d9a3..41e87a8 100644
--- a/gcc/tree-vectorizer.c
+++ b/gcc/tree-vectorizer.c
@@ -350,6 +350,33 @@ vect_destroy_datarefs (vec_info *vinfo)
}
+/* Return whether STMT is inside the region we try to vectorize. */
+
+bool
+vect_stmt_in_region_p (vec_info *vinfo, gimple *stmt)
+{
+ if (!gimple_bb (stmt))
+ return false;
+
+ if (loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo))
+ {
+ struct loop *loop = LOOP_VINFO_LOOP (loop_vinfo);
+ if (!flow_bb_inside_loop_p (loop, gimple_bb (stmt)))
+ return false;
+ }
+ else
+ {
+ bb_vec_info bb_vinfo = as_a <bb_vec_info> (vinfo);
+ if (gimple_bb (stmt) != BB_VINFO_BB (bb_vinfo)
+ || gimple_uid (stmt) == -1U
+ || gimple_code (stmt) == GIMPLE_PHI)
+ return false;
+ }
+
+ return true;
+}
+
+
/* If LOOP has been versioned during ifcvt, return the internal call
guarding it. */
@@ -692,6 +719,14 @@ pass_slp_vectorize::execute (function *fun)
scev_initialize ();
}
+ /* Mark all stmts as not belonging to the current region. */
+ FOR_EACH_BB_FN (bb, fun)
+ {
+ for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
+ gsi_next (&gsi))
+ gimple_set_uid (gsi_stmt (gsi), -1);
+ }
+
init_stmt_vec_info_vec ();
FOR_EACH_BB_FN (bb, fun)