aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBin Cheng <bin.cheng@arm.com>2017-03-28 15:35:56 +0000
committerBin Cheng <bin.cheng@arm.com>2017-03-28 15:35:56 +0000
commit6f4d2b95390968792d6e158466890d41f6c0a1cd (patch)
tree8a5453ed2ca619ddeb6950e881cbe6b779430443
parent531da930744c86c751ac9c60f360c174502f5237 (diff)
* tree-vect-loop.c (optimize_mask_stores): Add bb to the right
loop. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@246541 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/tree-vect-loop.c10
2 files changed, 13 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fa216e904ab..b57d40b0863 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
2017-03-28 Bin Cheng <bin.cheng@arm.com>
+ * tree-vect-loop.c (optimize_mask_stores): Add bb to the right
+ loop.
+
+2017-03-28 Bin Cheng <bin.cheng@arm.com>
+
* tree-vect-loop-manip.c (slpeel_add_loop_guard): New param and
mark new edge's irreducible flag accordign to it.
(vect_do_peeling): Check loop preheader edge's irreducible flag
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 6bbf8162a86..af874e7ad8e 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -7229,6 +7229,7 @@ optimize_mask_stores (struct loop *loop)
unsigned nbbs = loop->num_nodes;
unsigned i;
basic_block bb;
+ struct loop *bb_loop;
gimple_stmt_iterator gsi;
gimple *stmt;
auto_vec<gimple *> worklist;
@@ -7267,11 +7268,16 @@ optimize_mask_stores (struct loop *loop)
last = worklist.pop ();
mask = gimple_call_arg (last, 2);
bb = gimple_bb (last);
- /* Create new bb. */
+ /* Create then_bb and if-then structure in CFG, then_bb belongs to
+ the same loop as if_bb. It could be different to LOOP when two
+ level loop-nest is vectorized and mask_store belongs to the inner
+ one. */
e = split_block (bb, last);
+ bb_loop = bb->loop_father;
+ gcc_assert (loop == bb_loop || flow_loop_nested_p (loop, bb_loop));
join_bb = e->dest;
store_bb = create_empty_bb (bb);
- add_bb_to_loop (store_bb, loop);
+ add_bb_to_loop (store_bb, bb_loop);
e->flags = EDGE_TRUE_VALUE;
efalse = make_edge (bb, store_bb, EDGE_FALSE_VALUE);
/* Put STORE_BB to likely part. */